ims*_*msc 19 python sorting dictionary defaultdict
我有一个数据结构,如下所示:
不同年份的三个城市的人口如下.
Name 1990 2000 2010
A 10 20 30
B 20 30 10
C 30 10 20
Run Code Online (Sandbox Code Playgroud)
我用a defaultdict来存储数据.
from collections import defaultdict
cityPopulation=defaultdict(list)
cityPopulation['A']=[10,20,30]
cityPopulation['B']=[20,30,10]
cityPopulation['C']=[30,10,20]
Run Code Online (Sandbox Code Playgroud)
我想defaultdict根据列表中的特定列(年份)对其进行排序.比如说,1990年的排序,应该给C,B,A,而2010年的排序应该给A,C,B.
此外,这是存储数据的最佳方式吗?当我改变人口价值时,我希望它是可变的.
jam*_*lak 36
>>> 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])]
Run Code Online (Sandbox Code Playgroud)
请注意,在python 3中,您无法自动解压缩lambda参数,因此您必须更改代码
sorted(cityPopulation.items(), key=lambda k_v: k_v[1][2], reverse=True) #2010
Run Code Online (Sandbox Code Playgroud)
在Python 3.5中.
说你有这个defaultdict:
>>> d
defaultdict(<type 'int'>, {'ciao': 17, 'bye': 14, 'hello': 23})
Run Code Online (Sandbox Code Playgroud)
如果要根据值而不是键进行排序,请使用d.items()并设置键,lambda(k,v):v以便选择值.
>>> sorted(d.items(), key=lambda(k,v): v)
[('bye', 14), ('ciao', 17), ('hello', 23)]
Run Code Online (Sandbox Code Playgroud)
最后使用,reverse=True如果你想要更大的数字先来:
>>> sorted(d.items(), key=lambda(k,v): v, reverse=True)
[('hello', 23), ('ciao', 17), ('bye', 14)]
Run Code Online (Sandbox Code Playgroud)
请注意,key=lambda(k,v): v更清楚(对我而言)说key=lambda(v): v[1]:
>>> sorted(d.items(), key=lambda(v): v[1])
[('bye', 14), ('ciao', 17), ('hello', 23)]
Run Code Online (Sandbox Code Playgroud)
A defaultdict没有订单.您可能需要使用a OrderedDict或每次将键排序为列表.
例如:
from operator import itemgetter
sorted_city_pop = OrderedDict(sorted(cityPopulation.items()))
Run Code Online (Sandbox Code Playgroud)
编辑:如果您只想打印订单,只需使用sorted内置:
for key, value in sorted(cityPopulation.items()):
print(key, value)
Run Code Online (Sandbox Code Playgroud)