有很多类似的问题(here is one),但我见过的解决方案使用列表理解或过滤器,这些方法生成一个新列表(或者在Python 3中使用过滤器的新迭代器)。 X)。有些解决方案通过修改列表本身(like this,and this)来删除实例,这些将是我的最后手段。但是,我想看看是否有一个更优雅(“Pythonic”,另一个问题称之为)的方式。
为什么我忽略生成新列表的解决方案:我正在迭代列表集合,Python允许我修改我正在迭代的“当前”列表,但不是完全替换它:
>>> ll= [[1,2,3], [2,3,4], [4,5,6]]
>>> for l in ll:
if l[0] == 2:
l = [10]
>>> ll
[[1, 2, 3], [2, 3, 4], [4, 5, 6]] #replacement didn't happen
>>> for l in ll:
if l[0] == 2:
l.remove(2)
>>> ll
[[1, 2, 3], [3, 4], [4, 5, 6]] #modification succeeded
答案 0 :(得分:6)
您需要使用切片分配来替换所有列表元素而不是列表本身:
for l in ll:
if l[0] == 2:
l[:] = [10]
[:]
部分将其转换为切片分配;不是将引用l
替换为,而是使用新列表替换 l
中包含的所有元素。
演示:
>>> ll= [[1,2,3], [2,3,4], [4,5,6]]
>>> for l in ll:
... if l[0] == 2:
... l[:] = [10]
...
>>> ll
[[1, 2, 3], [10], [4, 5, 6]]