我发现了一些今天早上写剧本时,我没有想到的。 我试图用一个列表理解,这一切在一个语句排序,并得到了一个令人惊讶的结果。 下面的代码概括了我的一般使用情况下,但简化了这个问题:
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
如果我创建一个使用的理解列表,然后在事后对其进行排序,一切都很好。 我很好奇,为什么出现这种情况?
该方法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")
调用.sort
名单上返回None
。 这非常有意义,这个结果然后分配给result
。
换句话说,你以匿名方式创建一个列表与列表理解,然后调用.sort
,并且在结果列表中丢失.sort
调用存储在result
变量。
正如其他人所说,你应该使用sorted()
以返回一个列表内置函数。 ( sorted()
返回列表的排序复印件)。
你想要的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"))