2412

辞書のリストがあり、各項目を特定の値で並べ替えたいと考えています。

リストを考慮してください:

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

でソートするnameと、次のようになります。

[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
4

18 に答える 18

3133

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)
于 2008-09-16T14:39:44.273 に答える
203
import operator

辞書のリストを key='name' でソートするには:

list_of_dicts.sort(key=operator.itemgetter('name'))

辞書のリストを key='age' でソートするには:

list_of_dicts.sort(key=operator.itemgetter('age'))
于 2008-09-16T15:18:14.417 に答える
92
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が、マイレージは異なる場合があります。

于 2008-09-16T14:39:11.030 に答える
63

リストを複数のキーで並べ替える場合は、次のようにします。

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

比較のために値を単一の文字列表現に変換することに依存しているため、かなりハックですが、負の値を含む数値に対しては期待どおりに機能します (ただし、数値を使用している場合は、文字列をゼロ パディングで適切にフォーマットする必要があります)。

于 2010-05-18T15:28:11.290 に答える
34
import operator
a_list_of_dicts.sort(key=operator.itemgetter('name'))

「key」は任意の値でソートするために使用され、「itemgetter」はその値を各アイテムの「name」属性に設定します。

于 2008-09-16T14:43:51.550 に答える
25

私はあなたが意味したと思います:

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

これは次のようにソートされます。

sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))
于 2008-09-16T14:36:54.953 に答える
23

カスタム比較関数を使用するか、カスタム ソート キーを計算する関数を渡すことができます。キーは項目ごとに 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'))
于 2008-09-16T14:52:14.697 に答える
21

名前キーの値によって辞書を比較する独自の比較関数を実装する必要があります。PythonInfo Wiki のソート Mini-HOW TO を参照してください。

于 2008-09-16T14:31:52.577 に答える
13

これが代替の一般的な解決策です-キーと値で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)
于 2015-01-22T17:21:17.473 に答える
9

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

これをチェックしてください。

于 2014-04-16T07:18:21.040 に答える