我的目标:首先根据价格,然后按名称对产品的list (dict)进行排序。我的问题是:包含数字的Str值没有正确排序(AKA“人工排序”或“自然排序”)。
我从一个类似的问题中找到了这个函数:Python sorting list of dictionaries by multiple keys
def multikeysort(items, columns):
from operator import itemgetter
comparers = [((itemgetter(col[1:].strip()), -1) if col.startswith('-') else
(itemgetter(col.strip()), 1)) for col in columns]
def comparer(left, right):
for fn, mult in comparers:
result = cmp(fn(left), fn(right))
if result:
return mult * result
else:
return 0
return sorted(items, cmp=comparer)问题是我的价格是str型的,如下所示:
products = [
{'name': 'Product 200', 'price': '3000.00'},
{'name': 'Product 4', 'price': '100.10'},
{'name': 'Product 15', 'price': '20.00'},
{'name': 'Product 1', 'price': '5.05'},
{'name': 'Product 2', 'price': '4.99'},
]所以它们是按字母顺序排列的,像这样:
'100.10'
'20.10'
'3000.00'
'4.99'
'5.05'类似地,当我按名字排序时,我得到以下信息:
'Product 1'
'Product 15'
'Product 2'
'Product 200'
'Product 4'姓名应按“人”顺序列出(1,2,15,而不是1,15,2)。能解决这个问题吗?我对蟒蛇很陌生,所以我可能错过了一些重要的东西。谢谢。
编辑
更多信息:我将产品列表发送到Django模板,该模板要求正确格式化数字。如果我浮动价格,然后不浮动他们,我必须重复两次的产品列表,这似乎是过火。
发布于 2016-08-08 23:32:29
你的排序函数太过分了。试试这个简单的方法:
from pprint import pprint
products = [
{'name': 'Product 200', 'price': '3000.00'},
{'name': 'Product 4', 'price': '100.10'},
{'name': 'Product 15', 'price': '20.00'},
{'name': 'Product 1', 'price': '5.05'},
{'name': 'Product 2', 'price': '4.99'},
]
sorted_products = sorted(products, key=lambda x: (float(x['price']), x['name']))
pprint(sorted_products)结果:
[{'name': 'Product 2', 'price': '4.99'},
{'name': 'Product 1', 'price': '5.05'},
{'name': 'Product 15', 'price': '20.00'},
{'name': 'Product 4', 'price': '100.10'},
{'name': 'Product 200', 'price': '3000.00'}]我的解决方案的本质是让key函数返回排序条件的元组。元组总是按字典顺序进行比较,所以第一项是主要排序,第二项是次要排序,依此类推。
发布于 2016-08-08 23:31:08
我认为你最好的选择是把价格解析为浮动(这样你就可以对价格进行排序):
float("1.00")
# output: 1.0然后用两个小数位输出它们:
"{:.2f}".format(1.0)
# output: "1.00"发布于 2016-08-08 23:31:27
尝试将它们输入到问题中浮动,当您需要打印2位小数位时,您可以轻松地将输出格式化如下:
float_num = float("110.10")
print "{0:.2f}".format(float_num) # prints 110.10https://stackoverflow.com/questions/38839892
复制相似问题