python删除列表索引基于另一个列表

时间:2017-05-20 10:44:39

标签: python

我有两个清单,详情如下:

a = [[0, 1, 1, 2], [0, 5, 0, 0], [2, 0, 3, 3]]
remove_a_index = [[0], [0, 2, 3], [1]]

根据remove_a_index的数字删除基数列表索引的最佳解决方案是什么?对于[0]我需要删除数字0

5 个答案:

答案 0 :(得分:2)

您可以使用zip()enumerate()使用嵌套的列表理解表达式来过滤内容:

>>> a = [[0, 1, 1, 2], [0, 5, 0, 0], [2, 0, 3, 3]]
>>> remove_a_index = [[0], [0, 2, 3], [1]]

>>> a = [[j for i, j  in enumerate(x) if i not in y] for x, y in zip(a, remove_a_index)]
# where new value of `a` will be:
# [[1, 1, 2], [5], [2, 3, 3]]

根据您想要的结果,如果您只想从a列表中删除零,那么您就不需要中间remove_a_index列表。您可以使用 list comprehension 表达式跳过新列表中的零:

>>> a = [[0, 1, 1, 2], [0, 5, 0, 0], [2, 0, 3, 3]]

>>> [[j for j in i if j!=0] for i in a]
[[1, 1, 2], [5], [2, 3, 3]]

答案 1 :(得分:1)

如果我理解正确的问题,这应该有效:

for i, to_remove in enumerate(remove_a_index):
    for j in reversed(to_remove):
        del a[i][j]

答案 2 :(得分:1)

Python有一个名为List Comprehensions的语言功能,非常适合使这类事情变得非常简单。以下语句完全符合您的要求,并将结果存储在l3中:

As an example, if I have l1 = [1,2,6,8] and l2 = [2,3,5,8], l1 - l2 should return [1,6]

l3 = [x for x in l1 if x not in l2]
l3 will contain [1, 6].

希望这有帮助!

答案 3 :(得分:0)

您可以执行以下操作:

  1. 创建新列表。
  2. 修改您要删除的所有项目,然后删除'在原始名单上。
  3. 使用未删除'
  4. 的所有项目填充新列表

    代码:

    a_new=[]
    for i, item in enumerate(a):
        for element_to_remove in remove_a_index[i]:
            item[element_to_remove]='remove'
    
        new_item = [element  for element in item if element!='remove']
        a_new.append(new_item)
    a=a_new
    

答案 4 :(得分:0)

最短的单行内容如下:

a = [[0, 1, 1, 2], [0, 5, 0, 0], [2, 0, 3, 3]]
remove_a_index = [[0], [0, 2, 3], [1]]

b = [[y for y in original_tuple if y not in remove_a_index[index]] for index, original_tuple in enumerate(a)]
print b

为了解释,它使用列表推导来循环并使用索引:

[? for index, original_tuple in enumerate(a)]

此时索引为(0,1,2 ......),original_tuple为每个元组。

然后对于每个元组,您可以通过检查是否包含它来访问减去元组(remove_a_index [x])。

[y for y in original_tuple if y not in remove_a_index[index]] ...