比较两个列表 - Python

时间:2014-02-07 20:15:18

标签: python list

好的,我有两个列表,列表1和列表2.我想找到列表1和列表2中的所有项目,并从列表1中删除它们。我想到的第一种方式这是循环遍历列表1然后循环遍历列表2以查看它是否在列表2中,但是当放大时这看起来很慢且效率低。有没有更有效的方法呢?

此外,这些列表将按字母顺序排列(它们是字符串),如果这有用的话。

我正在使用python,但我也从一般的编程角度思考。

list1 = ['bar','foo','hello','hi']
list2 = ['alpha','bar','hello','xam']

list1将成为['foo','hi']

3 个答案:

答案 0 :(得分:6)

在python中,你可能想要使用一个集合:

intersection = set(list1).intersection(list2)

这将返回set,它会销毁订单(以及其他内容),但您可以随后使用该集合来过滤list1

list1 = [x for x in list1 if x not in intersection]

如果您真的想要使用该集合,则交集非常有用。正如评论中指出的那样,如果你根本不想要一套,那实际上并没有必要:

set2 = set(list2)
list1 = [x for x in list1 if x not in set2]

答案 1 :(得分:4)

使用set来区分两者:

list1 = ['bar','foo','hello','hi']
list2 = ['alpha','bar','hello','xam']

set1 = set(list1)
set2 = set(list2)
set1 - set2

输出:

set(['hi', 'foo'])

如@chepner所述,使用set.difference,只需将第一个转换为集合

set1.difference(list2)

如果订单很重要,请将一个设为一套,然后将另一个与之比较:

set2 = set(list2)
[x for x in list1 if x not in set2]

输出:

['foo', 'hi']

答案 2 :(得分:1)

这是使用通用编程方法的解决方案,不使用集合,也没有特别优化。它依赖于两个被排序的列表。

list1 = ['a', 'b', 'd', 'f', 'k']
list2 = ['c', 'd', 'i']
result = []

i1 = 0
i2 = 0
while i1 < len(list1) and i2 < len(list2):
    # invariants:
    #    list1[i1] not in list2[:i2], and
    #    result == (list1[:i1] with elements of list2[:i2] omitted)
    #
    if list1[i1] < list2[i2]:
        # By assumption, list1[i1] not in list2[:i2],
        # and because list2 is sorted, the true 'if' condition
        # implies that list1[i1] isn't in list2[i2:] either;
        # that is, it isn't in list2 at all.
        result.append(list1[i1])
        i1 += 1
    elif list1[i1] > list2[i2]:
        # can't decide membership of list1[i1] yet;
        # advance to next element of list2 and loop again
        i2 += 1
    else:
        # list1[i1] == list2[i2], so omit this element
        i1 += 1
        i2 += 1

# Add any remaining elements of list1 to tail of result
if i1 < len(list1):
    result.extend(list1[i1:])

print(result)

结果:     ['a', 'b', 'f', 'k']