我注意到今天早上写剧本时我没想到的东西。我尝试使用列表理解并在一个语句中对其进行排序,并得到了令人惊讶的结果。以下代码总结了我的一般用例,但针对此问题进行了简化:
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
如果我使用理解创建列表,那么事后对其进行排序,一切都很好。我很好奇为什么会这样?
答案 0 :(得分:32)
方法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")
。
答案 1 :(得分:2)
在列表上调用.sort
会返回None
。完全合理的是,此结果随后会分配给result
。
换句话说,您使用列表推导匿名创建列表,然后调用.sort
,当.sort
调用的结果存储在result
中时,列表会丢失变量
正如其他人所说,你应该使用sorted()
内置函数来返回一个列表。 (sorted()
返回列表的已排序副本。)
答案 2 :(得分: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"))