辞書のリストがあり、各項目を特定の値で並べ替えたいと考えています。
リストを考慮してください:
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
でソートするname
と、次のようになります。
[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
辞書のリストがあり、各項目を特定の値で並べ替えたいと考えています。
リストを考慮してください:
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
でソートするname
と、次のようになります。
[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
sorted()
関数はパラメータkey=
を取ります
newlist = sorted(list_to_be_sorted, key=lambda d: d['name'])
operator.itemgetter
または、関数を自分で定義する代わりに使用できます
from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name'))
reverse=True
完全を期すために、降順で並べ替えに追加します
newlist = sorted(list_to_be_sorted, key=itemgetter('name'), reverse=True)
import operator
辞書のリストを key='name' でソートするには:
list_of_dicts.sort(key=operator.itemgetter('name'))
辞書のリストを key='age' でソートするには:
list_of_dicts.sort(key=operator.itemgetter('age'))
my_list = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
my_list.sort(lambda x,y : cmp(x['name'], y['name']))
my_list
今あなたが望むものになります。
またはより良い:
Python 2.4 以降key
、より効率的でより適切な引数があります。
my_list = sorted(my_list, key=lambda k: k['name'])
...ラムダは、IMOよりも理解しやすいですoperator.itemgetter
が、マイレージは異なる場合があります。
リストを複数のキーで並べ替える場合は、次のようにします。
my_list = [{'name':'Homer', 'age':39}, {'name':'Milhouse', 'age':10}, {'name':'Bart', 'age':10} ]
sortedlist = sorted(my_list , key=lambda elem: "%02d %s" % (elem['age'], elem['name']))
比較のために値を単一の文字列表現に変換することに依存しているため、かなりハックですが、負の値を含む数値に対しては期待どおりに機能します (ただし、数値を使用している場合は、文字列をゼロ パディングで適切にフォーマットする必要があります)。
import operator
a_list_of_dicts.sort(key=operator.itemgetter('name'))
「key」は任意の値でソートするために使用され、「itemgetter」はその値を各アイテムの「name」属性に設定します。
私はあなたが意味したと思います:
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
これは次のようにソートされます。
sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))
カスタム比較関数を使用するか、カスタム ソート キーを計算する関数を渡すことができます。キーは項目ごとに 1 回だけ計算されるため、通常はより効率的ですが、比較関数はさらに何度も呼び出されます。
あなたはこのようにすることができます:
def mykey(adict): return adict['name']
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=mykey)
しかし、標準ライブラリには、任意のオブジェクトの項目を取得するための一般的なルーチンが含まれています: itemgetter
. 代わりにこれを試してください:
from operator import itemgetter
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=itemgetter('name'))
名前キーの値によって辞書を比較する独自の比較関数を実装する必要があります。PythonInfo Wiki のソート Mini-HOW TO を参照してください。
これが代替の一般的な解決策です-キーと値でdictの要素をソートします。
その利点 - キーを指定する必要がなく、一部の辞書で一部のキーが欠落している場合でも機能します。
def sort_key_func(item):
""" Helper function used to sort list of dicts
:param item: dict
:return: sorted list of tuples (k, v)
"""
pairs = []
for k, v in item.items():
pairs.append((k, v))
return sorted(pairs)
sorted(A, key=sort_key_func)
D
以下の要素を持つ辞書があるとしましょう。並べ替えるには、次のようにキー引数を使用しsorted
てカスタム関数を渡します。
D = {'eggs': 3, 'ham': 1, 'spam': 2}
def get_count(tuple):
return tuple[1]
sorted(D.items(), key = get_count, reverse=True)
# Or
sorted(D.items(), key = lambda x: x[1], reverse=True) # Avoiding get_count function call
これをチェックしてください。