将项添加到列表解析中的列表中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将项添加到列表解析中的列表中相关的知识,希望对你有一定的参考价值。
我有一个清单,比方说,a = [[1,2],[3,4],[5,6]]
我想将字符串'a'
添加到列表a
中的每个项目。
我用的时候:
a = [x.append('a') for x in a]
它返回[None,None,None]
。
但如果我使用:
a1 = [x.append('a') for x in a]
然后它做了一些奇怪的事。
a
,但不是a1
是[[1,2,'a'],[3,4,'a'],[5,6,'a']]
。
我不明白为什么第一次调用返回[None, None, None]
,为什么第二次调用a
而不是a1
。
list.append
改变了列表本身并返回None
。列表推导用于存储结果,如果您只想更改原始列表,则在这种情况下不是您想要的。
>>> x = [[1, 2], [3, 4], [5, 6]]
>>> for sublist in x:
... sublist.append('a')
...
>>> x
[[1, 2, 'a'], [3, 4, 'a'], [5, 6, 'a']]
正如其他人所说,append
会改变列表本身,你不应该将它分配给变量。执行它会改变它的数据,有效地更新指向它的每个人。
但是,当我想在功能*方式中做一些东西同时改变现有对象(而不是构造新对象,在这种情况下使用a=[x + ['a'] for x in a]
,或者特别是x + ['a']
)时,我会使用一个技巧。
所以,如果你足够勇敢,你也可以这样做:
>>> a=[[1,2],[3,4],[5,6]]
>>> a=[x.append('a') or x for x in a]
>>> a
[[1, 2, 'a'], [3, 4, 'a'], [5, 6, 'a']]
这是因为append
返回None
,并且or
继续搜索真值y值,x
是(它是一个list
,至少附加了它的内容)。
为什么我甚至需要这个?
假设您有一个列表,并且您希望将其中一些成员插入到新列表中,并相应地更新引用:
所以你有列表all
:
>>> all = [[], [], [], []]
其中一些插入并更新到新列表x
:
>>> x = [i.append('x') or i for i in all[:2]]
>>> x
[['x'], ['x']]
一些all
也被插入并更新到列表y
:
>>> y = [i.append('y') or i for i in all[1:3]]
all
更新:
>>> all
[['x'], ['x', 'y'], ['y'], []]
但x
也更新:
>>> x
[['x'], ['x', 'y']]
并且y
按预期生成:
>>> y
[['x', 'y'], ['y']]
总的来说,对于简单的任务,我建议明确使用for
循环更新。这就是pythonic。
从技术上讲,如果您有权访问列表类,则可以将其作为一个函数:
def more_functional_append(self, x):
self.append(x)
return self
- functional programming基于每个语句基本上做一件事,并没有副作用(所以,不变异和返回)。
append
不是很有用,因为它改变了一个列表(纯函数式编程只有不可变对象)并且没有返回结果传递给其他动作(函数)。使用函数式编程概念,您可以创建无人能阅读的大型单行程序,也称为“作业安全性”或“错误代码”。
对于第一种情况,它返回[None, None, None]
的原因是因为list.append
函数返回None
,这就是它存储在列表中的内容。
在第二种情况下,这是因为列表是可变的,并且每次附加值时,原始列表都会被修改。
您需要的是非就地附加运算符,例如+
。即[x + ['a'] for x in a]
。
(这是Mike Graham和sykora的答案的组合):
如果您只是想要就地更改值,请尝试使用常规for循环,而不是列表理解:
for sublist in a:
sublist.append('a')
如果你想单独留下,并把结果放在a1:
a1 = [sublist + ['a'] for sublist in a]
正如他们解释的那样,append
修改了列表,但返回None,而+
只留下列表,但返回一个新的附加列表。
您可以在列表推导中使用列表添加,如下所示:
a = [x + ['a']表示x中的]
这给出了期望的结果。在这种情况下,可以通过在循环之前为变量名指定['a']来提高效率,但这取决于您想要做什么。
离开a =
并使用a
的副作用:
[x.append('a') for x in a]
print a
在列表推导的第一个值赋值中,属性错误,'NoneType'对象没有属性'append',这有助于解释为什么你的列表a将加载None(s)。为了让我的控制台抛出错误,我使用x作为列表推导的变量,也作为迭代器。
Traceback (most recent call last):
x = [x.append('a') for x in a]
AttributeError: 'NoneType' object has no attribute 'append'
然后,我又回到了for x并且它抛出了同样的错误。
Traceback (most recent call last):
a = [x.append('a') for x in a]
AttributeError: 'NoneType' object has no attribute 'append'
以上是关于将项添加到列表解析中的列表中的主要内容,如果未能解决你的问题,请参考以下文章