排序列表理解在一个语句(Sorting A List Comprehension In One St

2019-07-30 09:13发布

我发现了一些今天早上写剧本时,我没有想到的。 我试图用一个列表理解,这一切在一个语句排序,并得到了一个令人惊讶的结果。 下面的代码概括了我的一般使用情况下,但简化了这个问题:

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

如果我创建一个使用的理解列表,然后在事后对其进行排序,一切都很好。 我很好奇,为什么出现这种情况?

Answer 1:

该方法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")



Answer 2:

调用.sort名单上返回None 。 这非常有意义,这个结果然后分配给result

换句话说,你以匿名方式创建一个列表与列表理解,然后调用.sort ,并且在结果列表中丢失.sort调用存储在result变量。

正如其他人所说,你应该使用sorted()以返回一个列表内置函数。 ( sorted()返回列表的排序复印件)。



Answer 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"))


文章来源: Sorting A List Comprehension In One Statement