如何从列表中删除一系列索引

4

我在 Python 3 中有两个长度相同的嵌套列表,如下:

A = [[0], [0, 1], [0, 1, 2], [0, 1], [0, 1, 2, 3]]
W = [[2, 2], [1, 2, 3], [2, 2, 2, 3], [1, 3, 4, 4], [1, 1, 3, 4]]

A的元素是W元素的索引。我想要移除给定AW元素。因此,在这个例子中,我想要移除W[0][0]W[1][0]W[1][1]W[2][0]W[2][1]W[2][2]等。

我的做法如下:

for t in range(len(A)):
    del W[t][A[t]]

但是这会导致以下错误:TypeError:列表索引必须是整数或切片,而不是列表

在这个循环中,你有打印出A[t]吗?那么你的错误(以及如何解决这个问题)应该就会变得很明显了。 - Mr. T
它打印出[0] [0, 1] [0, 1, 2] [0, 1] [0, 1, 2, 3],问题在哪里?我理解这个错误,但是我无法修复它。 - zdm
它们是列表。您必须从每个列表中检索每个整数,并从相应的W列表中删除该元素。函数enumerate()使这两个任务同步变得更加容易。 - Mr. T
2个回答

5

numpy数组不同的是,您不能使用列表对列表进行索引。但是,您可以使用列表推导来完成此任务:

A = [[0], [0, 1], [0, 1, 2], [0, 1], [0, 1, 2, 3]]
W = [[2, 2], [1, 2, 3], [2, 2, 2, 3], [1, 3, 4, 4], [1, 1, 3, 4]]

res = [[j for i, j in enumerate(w) if i not in a] for a, w in zip(A, W)]

print(res)

[[2], [3], [3], [4, 4], []]

或者,如果您乐意使用第三方库,numpy语法更简单:
import numpy as np

res = [np.delete(i, j).tolist() for i, j in zip(W, A)]

2

有一个简单的方法是使用两个嵌套循环。你可能已经注意到,你需要两个索引号——一个用于列表 A 中的列表,另一个用于该列表中元素的编号。下面是解决问题的一种方式:

A = [[0], [0, 1], [0, 1, 2], [0, 1], [0, 1, 2, 3]]
W = [[2, 2], [1, 2, 3], [2, 2, 2, 3], [1, 3, 4, 4], [1, 1, 3, 4]]

#cycle through list A and keep track of the list number i
for i, a_list in enumerate(A):
    #retrieve index from each list in A, start with the highest index to avoid index problems
    for j in sorted(a_list, reverse = True):
        #delete the element j in list i of W
        del W[i][j]

print(W)
#output
#[[2], [3], [3], [4, 4], []]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接