1

所以当我想从列表中删除一个索引序列时我遇到了麻烦

    for i in linked_node:
        del l[i]

linked_node 是索引序列,这段代码根本不起作用,因为 del 改变了列表的大小

使用 for 循环,我可以通过将它们附加到新列表来做到这一点

  l1 = []      
  for i in range(len(l)):
     if i is not in linked_node:
         l1.append(l[])

我的问题是,如何以优雅的方式做到这一点?不创建另一个列表

4

4 回答 4

5

改用列表推导:

>>> l = ['hi', 'hello', 'hey', 'hai']
>>> indexes = {1, 2}
>>> [j for i, j in enumerate(l) if i not in indexes]
['hi', 'hai']
于 2013-09-07T10:06:39.343 回答
2

如果您不想创建一个新列表,如@Haidro 的解决方案,但真的从现有列表中删除给定索引处的元素,您还可以反转索引列表,以便列表末尾的索引是先删了。

for i in sorted(linked_node, reverse=True):
    del l[i]

否则,您要删除的元素将在您删除元素时向左移动,从而更改它们的索引,您最终会删除错误的元素,或者得到一个IndexError.

于 2013-09-07T10:12:15.557 回答
1

您可以执行以下操作:

linked_node.sort(reversed=True)
for i in linked_node:
  del l[i]

现在这应该有效,因为您感兴趣的索引保持不变。如果它已经排序,另一种方法是:

for (x, i) in enumerate(linked_node):
  del l[i - x]
于 2013-09-07T10:13:47.623 回答
0

也使用反向迭代技巧,但速度更快,因为您不必对列表进行排序:

l = ["a", "b", "c", "d"]

for idx in range(len(l)-1, -1, -1):
    i = l[idx]
    print(i)
    if i in ["b", "d", "c"]:
        del(l[idx])
print(l) 

>>> d
>>> c
>>> b
>>> a
>>> ['a']
于 2013-09-07T10:18:28.927 回答