47

可能重复:
从 Python 中的两个列表中获取差异

这样做的简化方法是什么?我一直在自己尝试,我无法弄清楚。列表 a 和列表 b,新列表应该包含仅在列表 a 中的项目。所以:

a = apple, carrot, lemon
b = pineapple, apple, tomato
new_list = carrot, lemon

我尝试编写代码,但每次它总是将整个列表返回给我。

4

5 回答 5

54

您可以使用列表推导来编写此代码,该推导式可以非常准确地告诉我们哪些元素需要结束new_list

a = ['apple', 'carrot', 'lemon']
b = ['pineapple', 'apple', 'tomato']

# This gives us: new_list = ['carrot' , 'lemon']
new_list = [fruit for fruit in a if fruit not in b]

或者,使用 for 循环:

new_list = []
for fruit in a:
    if fruit not in b:
        new_list.append(fruit)

正如您所看到的,这些方法非常相似,这就是 Python 还具有列表推导以轻松构建列表的原因。

于 2012-07-11T14:18:54.623 回答
27

您可以使用一

# Assume a, b are Python lists

# Create sets of a,b
setA = set(a)
setB = set(b)

# Get new set with elements that are only in a but not in b
onlyInA = setA.difference(b)

更新
正如 iurisilvio 和 mgilson 指出的那样,这种方法仅在不包含重复项并且元素的顺序无关紧要a时才有效。b

于 2012-07-11T14:22:08.693 回答
9

你可能想要这个:

a = ["apple", "carrot", "lemon"]
b = ["pineapple", "apple", "tomato"]

new_list = [x for x in a if (x not in b)]

print new_list
于 2012-07-11T14:21:58.723 回答
7

这对你有用吗?

a = ["apple", "carrot", "lemon"]
b = ["pineapple", "apple", "tomato"]

new_list = []
for v in a:
    if v not in b:
        new_list.append(v)

print new_list

或者,更简洁地说:

new_list = filter(lambda v: v not in b, a)
于 2012-07-11T14:17:14.387 回答
2

使用集合set(或自 Sets 在 2.6 中弃用以来的内置)怎么样?

from sets import Set
a = Set(['apple', 'carrot', 'lemon'])
b = Set(['pineapple','apple','tomato'])
new_set =  a.difference(b)
print new_set

给出输出

Set(['carrot', 'lemon'])
于 2012-07-11T14:23:28.000 回答