为了账号安全,请及时绑定邮箱和手机立即绑定

得到两个列表之间的差异

得到两个列表之间的差异

月关宝盒 2019-06-17 15:10:02
得到两个列表之间的差异Python中有两个列表,如下所示:temp1 = ['One', 'Two', 'Three', 'Four']temp2 = ['One', 'Two']我需要创建第三个列表,其中包含第一个列表中没有出现在第二个列表中的项目。从我要得到的例子来看:temp3 = ['Three', 'Four']有没有循环和检查的快速方法?
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

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])).


查看完整回答
反对 回复 2019-06-17
?
ibeautiful

TA贡献1993条经验 获得超5个赞

现有的解决办法都提供以下两种办法之一:

  • 比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' answer4.2770634955  # This answer30.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' answer3.63890368748 # this answer (3 times faster!)37.7445402279 # matt b's answer


查看完整回答
反对 回复 2019-06-17
?
翻阅古今

TA贡献1780条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 0 关注
  • 442 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信