0

有很多与此类似的问题(这里是一个),但我见过的解决方案使用列表理解或过滤器,这些方法会生成一个新列表(或者在 Python 3.x 中的过滤器的情况下生成一个新的迭代器)。有一些解决方案可以通过修改列表本身来删除实例(比如 thisthis),这将是我最后的手段。但是,我想看看是否有更优雅(另一个问题称之为“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 
4

1 回答 1

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]]
于 2013-04-09T07:41:30.827 回答