我试图弄清楚如何使用另一个列表消除列表中的元素。 例如,假设我有:
eliminate([['dog', 'cat'], ['cat', 'fish'], ['dog', 'hamster]], ['dog', 'cat'])
[[], ['fish'], ['hamster]]
我尝试遍历子列表的所有元素,并检查它们是否在第二个列表中,以删除它们,但是我得到的列表与原始列表相同。 任何帮助都会很棒。
def eliminate(ballots, to_eliminate):
for sublist in ballots:
for elem in sublist:
if elem in to_eliminate:
ballots.pop(sublist.index(elem))
return ballots
答案 0 :(得分:0)
学习使用print
语句调试程序-您没有尝试。例如:
def eliminate(ballots, to_eliminate):
for sublist in ballots:
for elem in sublist:
if elem in to_eliminate:
print("\nsublist=", sublist, "\telem=", elem)
print("to_eliminate", to_eliminate)
print("index", sublist.index(elem))
ballots.pop(sublist.index(elem))
print("ballots", ballots)
return ballots
result = eliminate([['dog', 'cat'], ['cat', 'fish'], ['dog', 'hamster']], ['dog', 'cat'])
print(result)
输出:
sublist= ['dog', 'cat'] elem= dog
to_eliminate ['dog', 'cat']
index 0
ballots [['cat', 'fish'], ['dog', 'hamster']]
sublist= ['dog', 'cat'] elem= cat
to_eliminate ['dog', 'cat']
index 1
ballots [['cat', 'fish']]
[['cat', 'fish']]
这很清楚地显示了您的问题。
您确定消除元素dog
在该子列表的位置0的子列表之一中。您可以通过删除ballots[0]
而不是您标识的元素来处理此问题。修正您的pop
参考。
第二,您跳过ballots
中的子列表,因为要在遍历列表时更改列表。相反,创建一个仅包含要保留的元素的新列表。这是许多语言中的常见错误,并且在Stack Overflow上有数个重复项对此进行了介绍。
答案 1 :(得分:0)
如果可以返回新列表
def eliminate(ballots, to_eliminate):
ballots_n = []
for sublist in ballots:
temp_list = []
for elem in sublist:
if not elem in to_eliminate:
temp_list.append(elem)
ballots_n.append(temp_list)
return ballots_n