我有一个嵌套列表,如下所示:
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()
绑定到变量来解决这个问题,但是如何在列表推导中完成这项工作呢?此外,任何人都可以解释这种不直观的行为吗?
答案 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']]