30

今朝スクリプトを書いているときに、予期していなかったことに気づきました。リスト内包表記を使用して、すべてを1つのステートメントに並べ替えようとすると、驚くべき結果が得られました。次のコードは私の一般的なユースケースを要約したものですが、この質問のために簡略化されています。

Transaction = namedtuple('Transaction', ['code', 'type'])

my_list = [Transaction('code1', 'AAAAA'), Transaction('code2', 'BBBBB'), Transaction('code3', 'AAAAA')]

types = ['AAAAA', 'CCCCC']

result = [trans for trans in my_list if trans.type in types].sort(key = lambda x: x.code)

print result

出力:

None

理解度を使用してリストを作成し、事後に並べ替えると、すべて問題ありません。なぜこれが起こるのか興味がありますか?

4

3 に答える 3

51

このメソッドlist.sort()はリストを所定の位置に並べ替えており、すべての変更メソッドと同様に を返しますNone。組み込み関数sorted()を使用して、新しいソート済みリストを返します。

result = sorted((trans for trans in my_list if trans.type in types),
                key=lambda x: x.code)

の代わりにlambda x: x.code、少し速い を使用することもできますoperator.attrgetter("code")

于 2012-07-11T13:38:23.787 に答える
4

.sortリストを呼び出すと が返されますNone。この結果が に代入されることは完全に理にかなっていresultます。

つまり、リスト内包表記を使用して無名でリストを作成し、次に を呼び出します。呼び出しの結果が変数に格納されている.sort間、リストは失われます。.sortresult

他の人が言ったようsorted()に、リストを返すには組み込み関数を使用する必要があります。(sorted()リストのソートされたコピーを返します。)

于 2012-07-11T13:39:03.817 に答える
3

sorted組み込み関数が必要です。このsortメソッドはリストをその場でソートし、 を返しますNone

result = sorted([trans for trans in my_list if trans.type in types],key = lambda x: x.code)

これは、次の方法でわずかに改善できます。

import operator
result = sorted( (trans for trans in my_list if trans.type in types ), key=operator.attrgetter("code"))
于 2012-07-11T13:38:08.400 に答える