【问题标题】:Building a list of dictionary values, sorted by key构建字典值列表,按键排序
【发布时间】:2016-08-06 16:45:34
【问题描述】:

我有一个看起来像这样的 python 字典:

attributes = {
    'size': ['s','m','l'],
    'color': ['black', 'orange'],
}

我想得到一个值列表。如果我使用values(),我会得到:

>>> attributes.values()
[['black', 'orange'], ['s', 'm', 'l']]

但是,我希望列表的结果列表按字典键以相反的顺序排序——即大小然后颜色,而不是颜色然后大小。我想要这个:

[['s', 'm', 'l'], ['black', 'orange']]

我不一定事先知道字典键是什么,但我总是知道我想要它们按字母顺序还是逆字母顺序。

有没有一些pythonic方法可以做到这一点?

我唯一能想到的似乎......不太像python:

keys = sorted(attributes.keys(), reverse=True)
result = []
for key in keys:
    result.append(attributes[key])

很难从attributes.values() 到所有这些只是为了对列表进行排序!

【问题讨论】:

  • 字典是无序的,因此没有简单的方法来指定字典键的显示顺序。您可以订购显示,但不能订购字典中的键本身。但是,您可以尝试使用 Ordered Dict(包含在 Python 2.7+ 中)来解决这个问题。
  • sorted(attributes, reverse=True),你不需要.keys

标签: python sorting dictionary


【解决方案1】:

这段代码:

keys = sorted(attributes.keys(), reverse=True)
result = []
for key in keys:
    result.append(attributes[key])

基本上是发明列表推导的用例:

result = [attributes[key] for key in sorted(attributes.keys(), reverse=True)]

【讨论】:

  • 您可以像这样保存一些查找:[value for key,value in sorted(attributes.items(), reverse=True)]
  • result = [val for key, val in sorted(attributes.items(), reverse=True)] 以避免第二轮查找。 编辑:哈。被打的一拳。 :-)
  • @Robᵩ 很好,但我试图对原始代码进行尽可能少的更改,以便清楚它是如何翻译的。
  • 很好的答案!太奇怪了,这个答案的票太少了:-\
【解决方案2】:

最简单的方法是使用OrderedDict,它会记住插入元素的顺序:

import collections

result = collections.OrderedDict(sorted(attributes.items(), reverse=True))

>>> result.values()
[['s', 'm', 'l'], ['black', 'orange']]

【讨论】:

  • 我认为是询问基于键的字母顺序,而不是插入顺序...
  • 另请注意,从 Python 3.6 开始,这种行为也会发生在常规 dicts 上。
猜你喜欢
  • 1970-01-01
  • 2015-10-10
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2017-05-30
相关资源
最近更新 更多