我有一个整数元组列表列表。
ls = [[(a_1, a_2), (b_1, b_2)], [(c_1, c_2), (d_1, d_2), (e_1, e_2)], ...]
我需要删除包含第二个条目等于预定整数的元组的每个ls项。
我试过了:
for item in ls:
for tpl in item:
if tpl[1] == m:
ls.remove(item)
但由于某种原因,这只删除了一些列表项,但并不是所有列表项都包含第二个条目= m的元组。
答案 0 :(得分:3)
使用列表理解:
ls = [item for item in ls if all(tuple[1] != m for tuple in item)]
或使用过滤器:
ls = filter(lambda item: all(tuple[1] != m for tuple in item),ls)
答案 1 :(得分:1)
代码很糟糕,而且我们需要更少 - 这里的内容很少。
[l for l in ls if m not in [i[1] for i in l]]
答案 2 :(得分:0)
在python中过滤列表的最佳方法是使用列表解析:
filtered = [item for item in ls if not(contains_m(item))]
然后您需要的是一个可以判断项目是否包含m的函数,例如:
def contains_m(item):
return any([tpl[1] == m for tpl in item])
答案 3 :(得分:0)
从迭代中删除itme并不是一个好主意。
试试(如果在这里谈论Python)
ls = [[('a_1', 'a_2'), ('b_1', 'b_2')], [('c_1', 'c_2'), ('d_1', 'd_2'), ('e_1', 'e_2')]]
m='c_2'
print [ x for x in ls if not [ y for y in x if y[1]==m ]]
答案 4 :(得分:0)
Python的列表迭代器是懒惰的。这意味着当您从列表中删除项目时,它将跳过下一个项目。例如,假设您要从以下列表中删除所有内容:
[1, 1, 2]
您的for
循环从索引0
开始:
[1, 1, 2]
^
删除元素并继续:
[1, 2]
^
这个例子只是为了帮助说明这个问题。一个简单的解决方法是使用索引向后循环:
for ind in range(len(ls)-1, -1, -1):
item = ls[ind]
for tpl in item:
if tpl[1] == m:
del ls[ind]
break # You can end the inner loop immediately in this case
另一种方法是复制列表以进行迭代,但从原始列表中删除:
for item in ls[:]:
for tpl in item:
if tpl[1] == m:
ls.remove(item)
break
最后一种方法可以简化为创建仅包含所需元素的输出列表。这对列表理解最容易。请参阅@AlexeySmirnov的answer以获得最佳方法。