web-dev-qa-db-ja.com

pythonの値でdefaultdictをソートする

私は次のようなデータ構造を持っています:

異なる年の3つの都市の人口は次のとおりです。

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

また、これはデータを保存するための最良の方法ですか?人口の値を変更しているので、変更可能にしたいと考えています。

20
imsc
>>> 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
33
jamylak

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): vkey=lambda(v): v[1]を言う(私にとって)より明確な方法であることに注意してください。

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

defaultdictは注文を受け付けません。 OrderedDict を使用するか、キーをリストとして毎回ソートする必要がある場合があります。

例えば:

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

編集:注文を印刷するだけの場合は、sortedビルトインを使用します。

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