0

ネストされたリストがあります:

a = [[{'aa': 2L}, {}, {'mm': 9L}, {}, {}], [{'aa': 1L}, {}, {'mm': 5L}, {}, {}], [{'aa': 2L}, {}, {'mm': 7L}, {}, {}], [{'aa': 5L}, {}, {'mm': 7L}, {}, {}]]

必要な出力:

a = [[{'aa': 1L}, {}, {'mm': 5L}, {}, {}], [{'aa': 2L}, {}, {'mm': 7L}, {}, {}], [{'aa': 5L}, {}, {'mm': 7L}, {}, {}], [{'aa': 2L}, {}, {'mm': 9L}, {}, {}]]

a.sort()から取得している出力:

a = [[{'aa': 1L}, {}, {'mm': 5L}, {}, {}], [{'aa': 2L}, {}, {'mm': 7L}, {}, {}], [{'aa': 2L}, {}, {'mm': 9L}, {}, {}], [{'aa': 5L}, {}, {'mm': 7L}, {}, {}]]

望ましくありません。

ここでは、子リストのキーのいずれかを考慮してリスト'a'を並べ替えたいと思います。この場合、3番目の辞書とキー'mm'を使用しています。現在、キー'mm'は1つだけで、複数のキーがある可能性があります。値のペアですが、他の値を避けて、「mm」キーの値のみに基づいて並べ替えることができるはずです。

4

2 に答える 2

3

リストのリストがあるので、サブリストを並べ替える場合は、各サブリストを並べ替える必要があります。

a_sorted = [sorted(sublist) for sublist in a]

sorted()もちろん、外側のリストもソートしたい場合は、ソートされたリストのリストで実行できます。

sorted()組み込みのkey引数(リスト項目を受け取り、ソートする値を返す関数)を渡すことができます。リストをどのようにソートするかは少し不明確ですが、これで解決策を見つけることができるはずですが、明確にすることができます。

ただし、データ構造は少し奇妙に思えます。ペアがフォームにある{key: value}場合は、通常、タプル:(key, value)、またはすべてのペアをキーと値として含む単一のより大きなdictを使用する方が適切です。例:

a = [{'aa': 2L, 'mm': 7l}, {'aa': 2L, 'mm': 5L}, {'aa': 2L, 'mm': 9L}, {'aa': 2L, 'mm': 3L}]

この場合、-using-を使用sorted(a, key=itemgetter("mm"))して。operator.itemgetter()の値でソートできます'mm'

または、空のペアが必要な場合(Noneたとえば、キーを使用せずに)、タプルとして:

a = [[('aa', 2L), (,), ('mm', 7L), (,), (,)], [('aa', 2L), (,), ('mm', 5L), (,), (,)], [('aa', 2L), (,), ('mm', 9L), (,), (,)], [('aa', 2L), (,), ('mm', 3L), (,), (,)]]

ここでも同様のことができます。サブリストの3番目のアイテムの2番目のアイテムを抽出するクイック関数を作成するためsorted(a, key=lambda sublist: sublist[2][1])に使用します。lambda

データ構造をそのままにしておきたい場合(たとえば、より多くのコンテンツで辞書を拡張する場合)、同様の計画が機能します。sorted(a, key=lambda sublist: sublist[2]["mm"])今回'mm'は、でアクセスするために使用しますdict

于 2012-04-18T11:32:28.223 に答える
2

正しく質問があったかどうかはわかりませんが、答えは以下のように簡単に思えます。

キーの3番目の項目[3]にインデックスを付けてから、キーを使用して辞書のインデックスを再作成しますmm

>>> sorted(a,key=lambda key:key[2]['mm'])
[[{'aa': 1L}, {}, {'mm': 5L}, {}, {}], [{'aa': 2L}, {}, {'mm': 7L}, {}, {}], [{'aa': 5L}, {}, {'mm': 7L}, {}, {}], [{'aa': 2L}, {}, {'mm': 9L}, {}, {}]]
>>> 
于 2012-04-18T11:54:34.250 に答える