Сортировка 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)]