得到两个列表之间的差异

得到两个列表之间的差异

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

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

我需要创建第三个列表,其中包含第一个列表中没有出现在第二个列表中的项目。从我要得到的例子来看:

temp3 = ['Three', 'Four']

有没有循环和检查的快速方法?


月关宝盒
浏览 444回答 3
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])).

ibeautiful

现有的解决办法都提供以下两种办法之一:比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

翻阅古今

temp3 = [item for item in temp1 if item not in temp2]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python