在Python中的列表解析中使用临时匿名列表上的append()

时间:2011-11-15 20:11:20

标签: python list-comprehension

我有一个嵌套列表,如下所示:

mylist = [['A;B', 'C'], ['D;E', 'F']]

我希望以下列形式获得它:

[['A', 'B', 'C'], ['D', 'E', 'F']]

想我会写一个简单的列表理解来完成任务:

>>> newlist = [item[0].split(';').append(item[1]) for item in mylist]
>>> newlist
[None, None]

经过一些实验,我发现错误在于尝试在匿名列表中使用append()

>>> type(['A', 'B'])
<class 'list'>
>>> type(['A', 'B'].append('C'))
<class 'NoneType'>

考虑到你可以做这样的事情,这似乎是一个问题:

>>> 'abc'.upper()
'ABC'

显然在大多数情况下,你可以通过在调用['A', 'B']之前将append()绑定到变量来解决这个问题,但是如何在列表推导中完成这项工作呢?此外,任何人都可以解释这种不直观的行为吗?

4 个答案:

答案 0 :(得分:4)

[a.split(';') + [b] for a, b in mylist]

答案 1 :(得分:2)

问题是您要存储append()方法的返回值,即None

一种解决方案是使用itertools.chain()并将其存储在如下列表中:

import itertools
mylist = [['A;B', 'C'], ['D;E', 'F']]
newlist = [list(itertools.chain(item[0].split(';'),item[1])) for item in mylist]
print newlist

打印:

[['A', 'B', 'C'], ['D', 'E', 'F']]

答案 2 :(得分:1)

正如您所发现的那样,变异方法在列表理解中没有多大用处,因为瞬态对象会立即消失。

相反的是通过连接建立列表:

>>> mylist = [['A;B', 'C'], ['D;E', 'F']]
>>> [first.split(';') + [second] for first, second in mylist]
[['A', 'B', 'C'], ['D', 'E', 'F']]

答案 3 :(得分:0)

如上所述,append()的结果将是None,您实际上想要结果列表。这是一个选项:

>>> mylist = [['A;B', 'C'], ['D;E', 'F']]
>>> mylist = [item[0].split(';') + [item[1]] for item in mylist]
>>> mylist
[['A', 'B', 'C'], ['D', 'E', 'F']]