Сортировка defaultdict по значению в python
у меня есть структура данных, которая выглядит примерно так:
население трех городов за разные годы выглядит следующим образом.
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
.
кроме того, это лучший способ для хранения данных? Как я меняю я хочу, чтобы она была изменчивой.
3 ответов
>>> 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 Вы не можете автоматически распаковать лямбда-аргументы, поэтому вам придется изменить код
sorted(cityPopulation.items(), key=lambda k_v: k_v[1][2], reverse=True) #2010
A defaultdict
не держит заказа. Возможно, Вам понадобится использовать OrderedDict
, или сортировать ключи каждый раз в виде списка.
например:
from operator import itemgetter
sorted_city_pop = OrderedDict(sorted(cityPopulation.items()))
Edit: если вы просто хотите распечатать заказ, просто используйте sorted
builtin:
for key, value in sorted(cityPopulation.items()):
print(key, value)
В Python 3.5.
скажи, что у тебя есть это defaultdict
:
>>> d
defaultdict(<type 'int'>, {'ciao': 17, 'bye': 14, 'hello': 23})
если вы хотите выполнить сортировку на основе значений, а не в ключах, используйте u.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(u.items(), key=lambda(v): v[1])
[('bye', 14), ('ciao', 17), ('hello', 23)]