【问题标题】:Python sort (json) list by calculated valuePython按计算值排序(json)列表
【发布时间】:2016-08-27 08:06:11
【问题描述】:

我最初有一个带有产品的 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'}}

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

【问题讨论】:

  • 为什么是'price': '78 54'?你是什​​么意思?是78.547854 还是别的什么?请澄清。
  • 啊,是的,现在是 78.54 -> 很抱歉造成混乱。

标签: python json sorting


【解决方案1】:

您不能对字典进行排序,因为字典没有顺序。

但您可以执行以下操作:

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'})])

【讨论】:

  • 是的!非常好,我只需要用一个点替换空格就可以了!!!哦,伙计,那是我最后 48 小时的汗水和泪水,我爱你!太感谢了。 =)
  • 很高兴知道它对您有帮助。如果您觉得答案满足问题,您可以考虑接受(按✓ 号)。 (stackoverflow.com/help/someone-answers)
  • 哦,是的 - 我已经认为这对我来说一定是可能的。你说对了! :)
【解决方案2】:

欢迎来到 Stack Overflow。

如果你能给我们看一个代码 sn-p,我会很好,这样我们就可以查看它,看看你可能会卡在哪里。

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

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

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

【讨论】:

  • 也谢谢你,Ahsanul 的回答更详细一些 -> 但这朝着同一个方向发展,所以谢谢! :)
  • 我的代码不是用来运行的,我只是想给提问者一个大致的方向。我会在我的回答中指出,这更像是一个伪代码。
  • 我的代码不打算运行,我只是想给出一个大致的方向,需要做什么。我会在我的回答中指出,这更像是一个伪代码。
猜你喜欢
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
相关资源
最近更新 更多