在python中按值对defaultdict排序

时间:2012-04-17 15:57:37

标签: python sorting dictionary defaultdict

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

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

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

我使用defaultdict来存储数据。

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 个答案:

答案 0 :(得分:32)

>>> 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

答案 1 :(得分:8)

defaultdict没有订单。您可能需要使用OrderedDict,或者每次将键排序为列表。

E.g:

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

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

for key, value in sorted(cityPopulation.items()):
    print(key, value)

答案 2 :(得分:8)

在Python 3.5或更高版本中

说你有这个defaultdict

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

如果您想根据值而不是按键进行排序,请使用d.items()并使用lambda(k,v):v设置密钥,以便选择值。

>>> sorted(d.items(), key=lambda(k,v): v)
[('bye', 14), ('ciao', 17), ('hello', 23)]

如果你想要更大的数字,最后使用reverse=True

>>> sorted(d.items(), key=lambda(k,v): v, reverse=True)
[('hello', 23), ('ciao', 17), ('bye', 14)]

请注意,key=lambda(k,v): v更清楚(对我而言)说key=lambda(v): v[1]

>>> sorted(d.items(), key=lambda(v): v[1])
[('bye', 14), ('ciao', 17), ('hello', 23)]

答案 3 :(得分:1)

最新答案,而不是问题的直接答案,但是如果您从“ 在python中按值排序defaultdict ” google搜索结束,这就是我 sort 的方式(正常的python字典无法排序,但可以按顺序打印出来)defaultdict的值:

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