Python sort(json)按计算值列出

时间:2016-08-27 08:06:11

标签: python json sorting

我最初使用JSON格式的产品,挑战是按每单位最优价格(prdata3,prdata2,prdata1)对此列表进行排序:

{'prdata3': {'variation': 'stand', 'price': '78 54', 'amount': '6', 
      'url': 'https://www.productwebaddress.com/3'}, 
 'prdata2': {'variation': 'stand', 'price': '15 24', 'amount': '1', 
      'url': 'https://www.productwebaddress.com/2'}, 
 'prdata1': {'variation': 'vc', 'price': '78 54', 'amount': '12', 
      'url': 'https://www.productwebaddress.com/1'}}

价格需要除以金额,列表需要按此值排序,所以在我的例子中输出需要是(prdata1(6,55),prdata3(13,09),prdata2(15) ,24)):

{'prdata1': {'variation': 'vc', 'price': '78 54', 'amount': '12', 'url': 'https://www.productwebaddress.com/1'}, 'prdata3': {'variation': 'stand', 'price': '78 54', 'amount': '6', 'url': 'https://www.productwebaddress.com/3'}, 'prdata2': {'variation': 'stand', 'price': '15 24', 'amount': '1', 'url': 'https://www.productwebaddress.com/2'}}

这里最好的策略是什么?我尽力先用“为每个人”进去,寻找价格,用点替换空格,除以金额,然后使用此结果对我的列表进行排序:sorted(mylist.items(), key=lambda t: t[1]) ......但我的结果是关键,对吗?

2 个答案:

答案 0 :(得分:0)

您无法对字典进行排序,因为字典没有顺序。

但您可以执行以下操作:

print sorted(a.items(),key=lambda x:float(x[1]['price'])/int(x[1]['amount']))

输出:

[('prdata1', {'url': 'https://www.productwebaddress.com/1', 'price': '78.54', 'amount': '12', 'variation': 'vc'}), 
('prdata3', {'url': 'https://www.productwebaddress.com/3', 'price': '78.54', 'amount': '6', 'variation': 'stand'}), 
('prdata2', {'url': 'https://www.productwebaddress.com/2', 'price': '15.24', 'amount': '1', 'variation': 'stand'})]

并且,如果真的很重要,您可以使用collections.OrderedDict来保留字典结构。

from collections import OrderedDict
print OrderedDict(sorted(a.items(),key=lambda x:float(x[1]['price'])/int(x[1]['amount'])))

输出:

OrderedDict([('prdata1', {'url': 'https://www.productwebaddress.com/1', 'price': '78.54', 'amount': '12', 'variation': 'vc'}), 
('prdata3', {'url': 'https://www.productwebaddress.com/3', 'price': '78.54', 'amount': '6', 'variation': 'stand'}), 
('prdata2', {'url': 'https://www.productwebaddress.com/2', 'price': '15.24', 'amount': '1', 'variation': 'stand'})])

答案 1 :(得分:0)

欢迎使用Stack Overflow。

如果你能向我们展示一个代码片段,我会很高兴,所以我们可以查看它,看看你可能会陷入困境。

这可能是一个单行,因为明确的规范,它会像(伪代码,不会运行):

sorted(data, key=lambda x: float(x['price'].replace(' ', '.')) / int(x['amount']))

我希望这会有所帮助,但如果没有,请提供一些代码。