我有两个清单,详情如下:
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
答案 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)
您可以执行以下操作:
代码:
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]] ...