一个州的列表综合排序

2024-05-17 14:42:44 发布

您现在位置:Python中文网/ 问答频道 /正文

今天早上写剧本的时候,我注意到了一些我没想到的事情。我试着用一个列表来理解并将其归类到一个语句中,得到了一个令人惊讶的结果。下面的代码总结了我的通用用例,但是针对这个问题进行了简化:

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

如果我使用理解来创建列表,然后在事实之后对其进行排序,一切都很好。我很好奇为什么会这样?


Tags: 代码in列表transmytypecode语句
3条回答

在列表上调用.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"))

方法list.sort()正在对列表进行就地排序,作为所有的变异方法,它返回None。使用内置函数^{}返回一个新的排序列表。

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

相关问题 更多 >