从列表的不同索引中删除多个元素

时间:2017-08-31 07:15:38

标签: python

我有一个这样的列表:

>>> a = ['1G', '1G', '1G', '1G', '10G', '10G', '10G', '10G', '25G', '25G', '25G', '25G']

以下是我要在列表a中更改的元素的索引:

>>> ind = [4, 8]

我想用以下内容更改第4和第8个索引元素:

>>> mode = ['40G', '100G']

我试过了:

>>> for i, m in zip(ind, mode):
...  a[i] = m

通过这个,我可以更新列表a中的第4和第8个索引元素:

>>> a
['1G', '1G', '1G', '1G', '40G', '10G', '10G', '10G', '100G', '25G', '25G', '25G']

我想删除a后第8个索引(即5个,6个,7个)和第8个索引后的3个元素(即9,10,11个)后的3个元素,我无法在一个中删除它们射击。有人可以帮我解决这个问题吗?

>>> for i, m in zip(ind, mode):
...  del a[i+1:i+4]
...

但在此之后我松了索引

4 个答案:

答案 0 :(得分:1)

作为Ev。 Kounis提到,当你删除元素时,索引会向左移动一个位置,所以你必须考虑到这一点。先做。

idx_to_delete = [5, 6, 7, 9, 10, 11]
for i, x in enumerate(idx_to_delete):
    idx_to_delete[i] -= i

print(idx_to_delete)
[5, 5, 5, 6, 6, 6]

现在,您可以继续删除。

a = ['1G', '1G', '1G', '1G', '40G', '10G', '10G', '10G', '100G', '25G', '25G', '25G']
for i in idx_to_delete:
    del a[i]

print(a) 
['1G', '1G', '1G', '1G', '40G', '100G']

答案 1 :(得分:0)

问题是删除项目后元素的索引会发生变化。但是这个问题可以避开。获得列表a后,将要删除的索引存储在列表中并按相反顺序对其进行排序

a = ['1G', '1G', '1G', '1G', '40G', '10G', '10G', '10G', '100G', '25G', '25G', '25G']
del_ind = [5,6,7,9,10,11]
del_ind.sort()
del_ind = del_ind[::-1]

排序完成后,您可以继续删除项目。这样做的原因是因为当您删除最后一项时,所有其他项的索引保持不变。所以现在你不必担心改变指数 -

for i in del_ind:
    del a[i]
print(a)
# ['1G', '1G', '1G', '1G', '40G', '100G']

答案 2 :(得分:0)

我建议您使用slice功能:

a = [  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]
index = [4, 8]

a = a[:index[0]] + a[index[0]+3:index[1]] + a[index[1]+3 :]

print(a)

# result: [1, 2, 3, 4, 8, 12, 13, 14, 15]

这是有效的,因为slice不会更改列表,而是返回所选切片的新副本。有关切片的更多信息,请查看this StackOverflow answer.

答案 3 :(得分:0)

以下是我在评论中提到的两个解决方案:

  

赔偿:

a = ['1G', '1G', '1G', '1G', '40G', '10G', '10G', '10G', '100G', '25G', '25G', '25G']
ind = [4, 8]
to_delete = [i for j in [list(range(x+1, x+4)) for x in ind] for i in j]  
# can the compensation be incorporated in the list-comprehension? hmm..
counter = 0
for i in to_delete:
    a.pop(i - counter)
    counter += 1
print(a)  # ['1G', '1G', '1G', '1G', '40G', '100G']
  

从后面访问列表:

a = ['1G', '1G', '1G', '1G', '40G', '10G', '10G', '10G', '100G', '25G', '25G', '25G']
ind = [4, 8]
to_delete = sorted([i for j in [list(range(x+1, x+4)) for x in ind] for i in j], reverse=True)
for i in to_delete:
    a.pop(i)
print(a)  # ['1G', '1G', '1G', '1G', '40G', '100G']