从另一个列表中删除列表中的元素

时间:2019-11-13 17:03:56

标签: python

我试图弄清楚如何使用另一个列表消除列表中的元素。 例如,假设我有:

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

2 个答案:

答案 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