0

リストを含む辞書をソートしようとしています。たとえば、この辞書があるとします。

a = {'q': {3: [4, 2, 7]}, 'a': {1: [5, 45, 11]}, 'e': {23: [11, 45, 2]}}

並べ替え後の出力を次のようにします。

[(e, {23:[11,45,2}]), (a, {1:[5,45,11]}), (q,{3,[4,2,7]})] 

リストの最初の項目をソートのキーとして使用して、実際には逆にソートしています。

上記のように、2 つのリストの最初の項目が同一である場合、リストに関連付けられた文字列 (メイン キー) をアルファベット順に並べ替えます。

その辞書のリストをソートしているため、辞書を含むタプルの出力を取得できるかどうかはわかりません。

私はこのコードを試しました:

sorted((x,b.items(), key=lambda x:[1][2]) for x,b in a.items())

無効な構文のエラーが発生しましたが、何が問題なのかわかりません。

4

3 に答える 3

2

問題を部分的に分解しましょう。あなたは本当にリストをソートしたいのですa.items()。そう:

>>> to_sort = a.items()
>>> to_sort
[('q', {3: [4, 2, 7]}), ('a', {1: [5, 3, 11]}), ('e', {23: [11, 45, 2]})]

これで、リスト内の各要素に対して、値 ('q'など) と辞書のタプルができました。おそらく、各ディクショナリにはキーが 1 つしか含まれておらず、各ディクショナリの値の index-1 要素を主キーとして使用したいと考えています。したがって、最初の要素のキーは次のようになりto_sort[0][1].values()[0][1]ます。2 番目のソート キーは単に.to_sort[0][1]{3: [4, 2, 7]}.values()[[4, 2, 7]][0][1]2to_sort[0]

したがって、次のようになります。

>>> sorted(to_sort, key=lambda x: (x[1].values()[0][1], x[0]))
[('q', {3: [4, 2, 7]}), ('a', {1: [5, 3, 11]}), ('e', {23: [11, 45, 2]})]

私たちは、ほぼ、そこにいる。次に、逆の出力が必要であることを sort に伝える必要があります。

>>> sorted(to_sort, key=lambda x: (x[1].values()[0][1], x[0]), reverse=True)
[('e', {23: [11, 45, 2]}), ('a', {1: [5, 3, 11]}), ('q', {3: [4, 2, 7]})]

これは、あなたの望むことですか?

ワンライナーが必要な場合は、次のことができます。

>>> sorted(a.items(), key=lambda x: (x[1].values()[0][1], x[0]), reverse=True)
于 2013-02-06T01:01:04.783 に答える
1

少なくとも対話型インタープリターでは、完全なエラー メッセージで、エラーが発生している場所が正確に示されるはずです。

>>> sorted((x,b.items(), key=lambda x:[1][2]) for x,b in a.items())
  File "<stdin>", line 1
    sorted((x,b.items(), key=lambda x:[1][2]) for x,b in a.items())
                            ^
SyntaxError: invalid syntax

^が のすぐ下にあることに注意してください=

なぜそこでエラーが発生したのかはわかりませんが、少なくともどこを見ればよいかがわかります。

注意深く見てみると、次のサブ式に注目してください。

(x,b.items(), key=lambda x:[1][2])

これがタプルで、その 3 番目のメンバーはkey=lambda x:[1][2]です。しかし、それは表現として有効ではありません。したがって、間違った場所に括弧がいくつかあります。または、keyパラメーターを間違った場所に追加しました。私はあなたがこれを意味したと思います:

sorted(((x,b.items()) for x,b in a.items()), key=lambda x:[1][2])

いいえSyntaxError。それはIndexError後で起こりそうですが、そこに着いたら対処できます。

于 2013-02-06T00:50:29.503 に答える
0

100%確信があるわけではありませんが、最終的には満足していますか?

>>> a = {'q': {3: [4, 2, 7]}, 'a': {1: [5, 3, 11]}, 'e': {23: [11, 45, 2]}}
>>> new_order = sorted(a, key=lambda L: a[L].values(), reverse=True)
>>> zip(new_order, map(a.get, new_order))
[('e', {23: [11, 45, 2]}), ('a', {1: [5, 3, 11]}), ('q', {3: [4, 2, 7]})]
于 2013-02-06T01:00:00.213 に答える