在Python中按索引删除列表中的多个元素

时间:2018-11-30 20:13:37

标签: python list

我想通过其索引删除列表中的多个项目:

dS = [0, 0.02, 0, 0.04, 0.07, 0]
dN = [1, 0.02, 0.3, 0.7, 0.9]
pos = [i for i, e in enumerate(dS) if e ==0]

现在我想删除(在两个列表中)第一个列表中0位置上的所有项目。

4 个答案:

答案 0 :(得分:3)

假设您要删除的任何old_list都具有索引pos的列表:

new_list = [old_list[i] for i, e in enumerate(old_list) if i not in pos]

通过摆脱pos指定的索引处的元素,这将同时适用于您的问题列表,只需将old_list替换为当前拥有的列表名称:

dS = [0, 0.02, 0, 0.04, 0.07, 0]
dN = [1, 0.02, 0.3, 0.7, 0.9]
pos = [i for i, e in enumerate(dS) if e ==0]
dS = [dS[i] for i, e in enumerate(dS) if i not in pos]
dN = [dN[i] for i, e in enumerate(dN) if i not in pos]
>>> dS, dN
([0.02, 0.04, 0.07], [0.02, 0.7, 0.9])

对于上面长度不同的列表,此方法很好用。

答案 1 :(得分:1)

  

我想删除(在两个列表中)第一个列表中0位置上的所有项目。

首先,通过仅选择与第一个列表的非零项目相同索引的项目来处理第二个列表:

dN = [dN[i] for i, e in enumerate(dS) if e]

然后对dS做同样的操作(注意:在这种情况下,变体将使用filter

dS = list(filter(None,dS))

答案 2 :(得分:0)

您可以选择为每个列表创建新的副本,并省略某些元素,或者就地修改两个列表。

dS = [0, 0.02, 0, 0.04, 0.07, 0]
dN = [1, 0.02, 0.3, 0.7, 0.9]

# make copies of both lists while omitting indices
# that corresponds to zeros in dS
dS, dN = map(list, zip(*[(s, n) for s, n in zip(dS, dN) if s != 0]))

# alternatively, modify lists inplace
dS = [0, 0.02, 0, 0.04, 0.07, 0]
dN = [1, 0.02, 0.3, 0.7, 0.9]

# process lists in reverse
for i in range(1, len(dS)):
    try:
        if dS[-i] == 0:
            del dS[-i], dN[-i]
    except IndexError:
        break

答案 3 :(得分:0)

由于列表的长度不同,因此只需要遍历列表pos并从两个列表中删除,例如:(重要的是在pos中以相反的顺序运行,以确保您不会尝试删除元素不再存在的索引)

for idx in pos[::-1]:
        del dS[idx]
        if idx < len(dN):
            del dN[idx]