如何从列表中减去列表?

2024-04-25 02:31:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个从列表中减去列表的代码

例如:

list1 = ['hi', 'hi', 'once', 'twice']
list2 = ['hi', 'once', 'twice']

减去我想要的列表的结果是:

differenceoflists = ['hi']

目前,我正在使用代码

list1 = ['hi', 'hi', 'once', 'twice']
list2 = ['hi', 'once', 'twice']
differenceoflists = []
for i in list1:
    if i not in list2:
        differenceoflists.append(i)
print(differenceoflists)

然而,这段代码并没有按我所希望的方式运行。当我希望它返回['hi']时,它返回一个空列表。如何才能正确地执行此操作


Tags: 代码in列表forif方式nothi
2条回答

您的代码无法正常工作,因为它无法跟踪list2中的项被用来丢弃list1中相应项的频率

您可以从list1的副本开始创建differenceoflists,然后从list2中删除所有项目,而不是通过添加项来构建differenceoflists。这样,对应的项对只匹配一次,如果一个项在list1中比在list2中更频繁地被包含,则额外项将保留

要从列表中删除项目,可以使用remove方法。当您试图删除的项目不在列表中时,您需要处理这种情况(只需忽略它)

def differenceoflists(list1, list2):
    d = list1.copy()
    for i in list2:
        try:
            d.remove(i)
        except ValueError:
            pass  # ignore that i is not in list1
    return d

当将此代码与Jab's answer中显示的代码进行比较时,结果中包含项的顺序存在一些细微的差异。根据您的具体需要,您需要选择其中之一

differenceoflists从左侧删除项目,而differenceoflists_jab从右侧删除项目:

>>> differenceoflists([1, 3, 5, 1], [5, 1])
[3, 1]
>>> differenceoflists([1, 3, 5, 1], [1, 5])
[3, 1]
>>> differenceoflists_jab([1, 3, 5, 1], [5, 1])
[1, 3]
>>> differenceoflists_jab([1, 3, 5, 1], [1, 5])
[1, 3]

differenceoflists_jab不保留list1中项目的顺序:

>>> differenceoflists([1, 3, 5, 1], [5])
[1, 3, 1]
>>> differenceoflists_jab([1, 3, 5, 1], [5])
[1, 1, 3]

这也可以通过使用collections.Counter来完成。您可以将计数器相互减去,然后将结果变成一个列表:

from collections import Counter

list1 = ['hi', 'hi', 'once', 'twice']
list2 = ['hi', 'once', 'twice']

difference_of_lists = list((Counter(list1) - Counter(list2)).elements())

print(difference_of_lists)

['hi']

相关问题 更多 >