Get difference between two lists

前端 未结 27 3421
傲寒
傲寒 2020-11-21 11:36

I have two lists in Python, like these:

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

I need to create a third

27条回答
  •  天命终不由人
    2020-11-21 11:58

    The existing solutions all offer either one or the other of:

    • Faster than O(n*m) performance.
    • Preserve order of input list.

    But so far no solution has both. If you want both, try this:

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

    Performance test

    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)
    

    Results:

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

    The method I presented as well as preserving order is also (slightly) faster than the set subtraction because it doesn't require construction of an unnecessary set. The performance difference would be more noticable if the first list is considerably longer than the second and if hashing is expensive. Here's a second test demonstrating this:

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

    Results:

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

提交回复
热议问题