私は次のようなデータ構造を持っています:
異なる年の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
。
また、これはデータを保存するための最良の方法ですか?人口の値を変更しているので、変更可能にしたいと考えています。
>>> 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
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): v
はkey=lambda(v): v[1]
を言う(私にとって)より明確な方法であることに注意してください。
_>>> sorted(d.items(), key=lambda(v): v[1])
[('bye', 14), ('ciao', 17), ('hello', 23)]
_
defaultdict
は注文を受け付けません。 OrderedDict
を使用するか、キーをリストとして毎回ソートする必要がある場合があります。
例えば:
from operator import itemgetter
sorted_city_pop = OrderedDict(sorted(cityPopulation.items()))
編集:注文を印刷するだけの場合は、sorted
ビルトインを使用します。
for key, value in sorted(cityPopulation.items()):
print(key, value)