在Python中比较一个列表中的项值与另一个列表中的其他项

3
我希望能够将一个列表中的值与另一个列表中的值进行比较,并返回所有在第一个列表中但不在第二个列表中的值,即:
list1 = ['one','two','three','four','five']
list2 = ['one','two','four']

会返回“three”和“five”。

我只有一点点Python的经验,所以这可能是一种荒谬和愚蠢的解决方法,但这是我目前为止所做的:

def unusedCategories(self):
    unused = []
    for category in self.catList:
        if category != used in self.usedList:
            unused.append(category)
    return unused

然而,这会抛出一个“iteration over non-sequence”的错误,我理解这意味着其中一个或两个“lists”实际上并不是列表(两者的原始输出格式与我的第一个示例相同)。
5个回答

8

set(list1).difference(set(list2))


6
使用集合获取列表之间的差异:
>>> list1 = ['one','two','three','four','five']
>>> list2 = ['one','two','four']
>>> set(list1) - set(list2)
set(['five', 'three'])

这对我来说很好用,而且很简单,所以我想现在就坚持使用它,感谢大家快速和有帮助的输入。 - chrism
@chrism:你是在暗示这里发布的其他内容都很复杂吗? - SilentGhost
不,但也许是因为我太简单了,无法弄清楚为什么我先前尝试的其他方法的实现没有起作用? - chrism
我知道这个很老了,但是还有其他人遇到set会将项目字符串转换为Unicode的问题吗? - Melody Anoni

1
使用 set.difference
>>> list1 = ['one','two','three','four','five']
>>> list2 = ['one','two','four']
>>> set(list1).difference(list2)
{'five', 'three'}

你可以跳过将list2转换为集合的步骤。


0

你可以使用集合或列表推导来完成:

unused = [i for i in list1 if i not in list2]

当我直接输入示例列表时,这个程序可以工作,但是当我尝试使用我的自动列表(例如,list1 = self.catList)时,它就无法工作了——再次出现了迭代非序列错误,这是否意味着self.catList并没有真正提供一个列表? - chrism

0

这里的所有答案都是正确的。如果列表很短,我会使用列表推导式;集合将更有效率。在探索为什么您的代码不起作用时,我没有收到错误信息。(它不起作用,但这是另一个问题)。

>>> list1 = ['a','b','c']
>>> list2 = ['a','b','d']
>>> [c for c in list1 if not c in list2]
['c']
>>> set(list1).difference(set(list2))
set(['c'])
>>> L = list()
>>> for c in list1:
...     if c != L in list2:
...         L.append(c)
... 
>>> L
[]

问题在于这个if语句没有意义。希望这可以帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接