获取两个列表之间的差异

2024-04-27 00:46:47 发布

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

我有两个Python列表,如下所示:

temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two']

我需要创建第三个列表,其中包含第一个列表中不在第二个列表中的项。从这个例子中我得到:

temp3 = ['Three', 'Four']

有没有没有没有没有周期和检查的快速方法?


Tags: 方法列表one例子threefourtwotemp2
3条回答
In [5]: list(set(temp1) - set(temp2))
Out[5]: ['Four', 'Three']

小心点

In [5]: set([1, 2]) - set([2, 3])
Out[5]: set([1]) 

你可能希望它等于set([1, 3])。如果您确实想用set([1, 3])作为答案,则需要使用set([1, 2]).symmetric_difference(set([2, 3]))

temp3 = [item for item in temp1 if item not in temp2]

现有的解决方案都提供以下其中一种:

  • 比O(n*m)性能快。
  • 保持输入列表的顺序。

但到目前为止,还没有一个解决方案同时具备这两种功能。如果两者都需要,请尝试以下操作:

s = set(temp2)
temp3 = [x for x in temp1 if x not in s]

性能测试

import timeit
init = 'temp1 = list(range(100)); temp2 = [i * 2 for i in range(50)]'
print timeit.timeit('list(set(temp1) - set(temp2))', init, number = 100000)
print timeit.timeit('s = set(temp2);[x for x in temp1 if x not in s]', init, number = 100000)
print timeit.timeit('[item for item in temp1 if item not in temp2]', init, number = 100000)

结果:

4.34620224079 # ars' answer
4.2770634955  # This answer
30.7715615392 # matt b's answer

我提出的方法以及保持顺序也比集合减法(稍微)快,因为它不需要构造不必要的集合。如果第一个列表比第二个列表长得多,并且哈希运算很昂贵,那么性能差异将更加明显。下面的第二个测试证明了这一点:

init = '''
temp1 = [str(i) for i in range(100000)]
temp2 = [str(i * 2) for i in range(50)]
'''

结果:

11.3836875916 # ars' answer
3.63890368748 # this answer (3 times faster!)
37.7445402279 # matt b's answer

相关问题 更多 >