ari*_*iel 23 python list-comprehension list append
我有一个清单,比方说, a = [[1,2],[3,4],[5,6]]
我想将字符串添加'a'到列表中的每个项目a.
我用的时候:
a = [x.append('a') for x in a]
Run Code Online (Sandbox Code Playgroud)
它返回[None,None,None].
但如果我使用:
a1 = [x.append('a') for x in a]
Run Code Online (Sandbox Code Playgroud)
然后它做了一些奇怪的事.
a,但不a1为[[1,2,'a'],[3,4,'a'],[5,6,'a']].
我不明白为什么第一次调用返回[None, None, None],为什么第二次调用a而不是a1.
Mik*_*ham 33
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']]
Run Code Online (Sandbox Code Playgroud)
Reu*_*ani 14
正如其他人所说,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']]
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为append返回None,并or继续搜索真值y值,这x 是(它list至少是附加到它的内容).
为什么我甚至需要这个?
假设您有一个列表,并且您希望将其中一些成员插入到新列表中,并相应地更新引用:
所以你有这个清单all:
>>> all = [[], [], [], []]
Run Code Online (Sandbox Code Playgroud)
其中一些插入并更新到新列表x:
>>> x = [i.append('x') or i for i in all[:2]]
>>> x
[['x'], ['x']]
Run Code Online (Sandbox Code Playgroud)
其中一些all也被插入并更新到列表y:
>>> y = [i.append('y') or i for i in all[1:3]]
Run Code Online (Sandbox Code Playgroud)
all 已更新:
>>> all
[['x'], ['x', 'y'], ['y'], []]
Run Code Online (Sandbox Code Playgroud)
但x也更新了:
>>> x
[['x'], ['x', 'y']]
Run Code Online (Sandbox Code Playgroud)
而y如预期的那样产生:
>>> y
[['x', 'y'], ['y']]
Run Code Online (Sandbox Code Playgroud)
总的来说,对于简单的任务,我建议for明确使用循环更新.这就是pythonic.
从技术上讲,如果您有权访问列表类,则可以将其作为一个函数:
def more_functional_append(self, x):
self.append(x)
return self
Run Code Online (Sandbox Code Playgroud)
append因为它改变了一个列表(纯函数式编程只有不可变对象)并且不返回传递给其他动作(函数)的结果,所以它不是很有用.使用函数式编程概念,您可以创建无人能阅读的大型单行程序,也称为"作业安全性"或"错误代码".syk*_*ora 11
对于第一种情况,它返回的原因[None, None, None]是因为list.append函数返回None,这就是它在列表中存储的内容.
在第二种情况下,这是因为列表是可变的,并且每次附加值时,原始列表都会被修改.
你需要的是一个非就地附加运算符,例如+.即[x + ['a'] for x in a].
小智 7
您可以在列表理解中使用列表添加,如下所示:
a = [x + ['a'] for x in a]
Run Code Online (Sandbox Code Playgroud)
这给出了 a 的期望结果。在这种情况下,可以通过在循环之前将 ['a'] 分配给变量名来提高效率,但这取决于您想要做什么。
(这是 Mike Graham 和 sykora 的答案的组合):
如果您只想就地更改值,请尝试常规 for 循环,而不是列表理解:
for sublist in a:
sublist.append('a')
Run Code Online (Sandbox Code Playgroud)
如果你想保留a,并将结果放入a1:
a1 = [sublist + ['a'] for sublist in a]
Run Code Online (Sandbox Code Playgroud)
正如他们所解释的,append修改列表,但返回 None,同时+保留列表,但返回一个新的附加列表。
| 归档时间: |
|
| 查看次数: |
38668 次 |
| 最近记录: |