我有一个这样的列表:
>>> 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]
...
但在此之后我松了索引
答案 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']