2012-07-11 4 views
11

私は今朝スクリプトを書くときに私が期待していないことに気付きました。私はリストの理解を使い、1つのステートメントですべてをソートしようとしましたが、驚くべき結果を得ました。次のコードは、私の一般的なユースケースをまとめたものが、この質問のために簡略化されていますリストの理解を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 

、その後、事実の後にそれをソートし、すべてがあります良い。なぜこれが起こるのか不思議です。

+2

'sort'メソッドはリスト* in-place *をソートしてから' None'を返します。 – sloth

答えて

21

場所でリストを並べ替えている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")わずかに速いを使用することができます。

0

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")) 
+0

リストの理解度を 'sorted()'に渡すと、リストのコピーが作成されます。これは必ずしも遅くなるわけではありませんが、メモリ消費量が増加する可能性があります。 –

+0

ジェネレータ式をカッコで囲む必要があります。 –

+0

@SvenMarnach - あなたはかっこは必要ありませんか? 'ソート済み(xはxrange(10)でx)'は私のためにうまく動作します – mgilson

2

.sortを呼び出すと、Noneが返されます。この結果はresultに割り当てられます。言い換えれば

は、あなたがして、リスト内包して匿名でリストを作成.sortを呼び出し、.sort呼び出しの結果がresult変数に格納されている間リストが失われます。

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

関連する問題