28

我有一个类似这样的数据结构:

三个城市不同年份的人口如下。

Name  1990 2000 2010
A     10   20   30
B     20   30   10
C     30   10   20

我正在使用 adefaultdict来存储数据。

from collections import defaultdict
cityPopulation=defaultdict(list)
cityPopulation['A']=[10,20,30]
cityPopulation['B']=[20,30,10]
cityPopulation['C']=[30,10,20]

我想defaultdict根据列表的特定列(年份)进行排序。比如说,1990 年的排序应该给出C,B,A,而 2010 年的排序应该给出A,C,B

另外,这是存储数据的最佳方式吗?当我改变人口值时,我希望它是可变的。

4

4 回答 4

40
>>> sorted(cityPopulation.iteritems(),key=lambda (k,v): v[0],reverse=True) #1990
[('C', [30, 10, 20]), ('B', [20, 30, 10]), ('A', [10, 20, 30])]
>>> sorted(cityPopulation.iteritems(),key=lambda (k,v): v[2],reverse=True) #2010
[('A', [10, 20, 30]), ('C', [30, 10, 20]), ('B', [20, 30, 10])]

请注意,在 python 3 中,您不能自动解压缩 lambda 参数,因此您必须更改代码

sorted(cityPopulation.items(), key=lambda k_v: k_v[1][2], reverse=True) #2010
于 2012-04-17T16:13:04.857 回答
18

如果要根据值而不是键进行排序,请使用data.items()并设置键,lambda kv: kv[1]以便它选择值。


看一个例子defaultdict

>>> from collections import defaultdict
>>> data = defaultdict(int)
>>> data['ciao'] = 17
>>> data['bye'] = 14
>>> data['hello'] = 23

>>> data
defaultdict(<type 'int'>, {'ciao': 17, 'bye': 14, 'hello': 23})

现在,让我们按值排序:

>>> sorted(data.items(), lambda kv: kv[1])
[('bye', 14), ('ciao', 17), ('hello', 23)]

最后reverse=True,如果您希望更大的数字排在第一位,请使用:

>>> sorted(data.items(), lambda kv: kv[1], reverse=True)
[('hello', 23), ('ciao', 17), ('bye', 14)]

请注意,这key=lambda(k,v): v是一种更清晰(对我而言)的说法key=lambda(v): v[1],只是后者是 Python 3 允许它的唯一方式,因为lambda 中的自动元组解包不可用

在 Python 2 中,你可以说:

>>> sorted(d.items(), key=lambda(k,v): v)
[('bye', 14), ('ciao', 17), ('hello', 23)]
于 2016-12-02T12:24:08.910 回答
11

Adefaultdict没有秩序。您可能需要使用OrderedDict, 或每次将键排序为列表。

例如:

  from operator import itemgetter
  sorted_city_pop = OrderedDict(sorted(cityPopulation.items()))

编辑:如果您只想打印订单,只需使用sorted内置:

for key, value in sorted(cityPopulation.items()):
    print(key, value)
于 2012-04-17T16:00:47.837 回答
2

迟到的答案,而不是问题的直接答案,但如果你最终从“在 python 中按值排序 defaultdict ”谷歌搜索,这就是我的排序方式(普通的 python 字典不能排序,但它们可以是打印排序) adefaultdict按其值:

orders = {
    'cappuccino': 54,
    'latte': 56,
    'espresso': 72,
    'americano': 48,
    'cortado': 41
}

sort_orders = sorted(orders.items(), key=lambda x: x[1], reverse=True)

for i in sort_orders:
    print(i[0], i[1])
于 2020-06-17T00:21:45.333 回答