2010-02-11 139 views
3

我想在一个列表中的值比较值在第二列表,并将所有那些在第一个列表中,但不是在第二即比较列表项的值在其他列表中的其他项目在Python

list1 = ['one','two','three','four','five'] 
list2 = ['one','two','four'] 

会返回'三'和'五'。

我只有与Python的一点经验,所以这可能变成是一个荒谬和愚蠢的方式来试图解决这个问题,但是这是我迄今所做的:

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

然而,这将引发我收集到的意思是一个或两个“列表”实际上不是列表(两者的原始输出格式与我的第一个示例格式相同)

回答

6

使用set to得到名单之间的区别:

>>> list1 = ['one','two','three','four','five'] 
>>> list2 = ['one','two','four'] 
>>> set(list1) - set(list2) 
set(['five', 'three']) 
+0

这对我来说很好,再加上它很简单,所以我认为我会坚持使用这一个,谢谢大家对于你的迅速和有帮助的输入 – chrism 2010-02-11 13:14:36

+0

@chrism:你是否暗示这里发布的其他东西很复杂? – SilentGhost 2010-02-11 13:33:34

+0

不,但也许我太简单了,为什么我首先尝试的其他事情的实现不起作用? – chrism 2010-02-11 13:59:34

8

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

0

您可以设置或列表理解做到这一点:

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

这可以直接输入样本列表,但不会当我尝试使用我的自动列表(例如list1 = self.catList) - 再次对非序列错误进行迭代时,这是否意味着self.catList isn'真的提供一份清单吗? – chrism 2010-02-11 13:03:06

1

set.difference

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

你可以跳过的list2转换设置。

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声明没有意义。 希望这有助于。

相关问题