Подтвердить что ты не робот

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

Кроме того, это лучший способ хранения данных? Когда я изменяю значения популяции, я хочу, чтобы она была изменчивой.

4b9b3361

Ответ 1

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

Ответ 2

A defaultdict не имеет порядка. Возможно, вам придется использовать OrderedDict или сортировать ключи каждый раз в качестве списка.

например:

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

Изменить: если вы просто хотите распечатать заказ, просто используйте sorted builtin:

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

Ответ 3

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