一种pythonic方法,用于删除元素的所有实例而不生成新列表

时间:2013-04-09 07:39:51

标签: python list data-structures

有很多类似的问题(here is one),但我见过的解决方案使用列表理解或过滤器,这些方法生成一个新列表(或者在Python 3中使用过滤器的新迭代器)。 X)。有些解决方案通过修改列表本身(like thisand 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 

1 个答案:

答案 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]]