python - Search for same values in 2 lists but only once if duplicate -
lst1 = [0.0, 2.0, 2.0, 3.0, 4.0, 6.0, 6.0, 7.0, 8.0, 8.0, 10.0, 10.0, 10.0, 13.0] lst2 = [4., 8.] [i i, j in enumerate(lst1) if j in lst2]
i return of:
[4, 8, 9]
what want achieve want return of:
[4, 8]
because 8.0
repeated in lst1
, want once. best way of achieving this?
the best way can readily think of is, maintain set of seen numbers , if number not in seen
set add index
result
, number seen
set.
result, seen = [], set() index, item in enumerate(lst1): if item not in seen , item in lst2: result.append(index) seen.add(item) print(result) # [4, 8]
note 1: use set
maintaining seen
items, because lookups fast (constant time lookup)
note 2: if lst2
going long list, better convert set, item in lst2
lookup happen in constant time. actual code becomes,
result, seen, set2 = [], set(), set(lst2) index, item in enumerate(lst1): if item not in seen , item in set2: result.append(index) seen.add(item) print(result) # [4, 8]
this give better performance first version, if lst2
going lengthy one.
an alternate solution inspired dsm's solution is, building reverse index dictionary, this
>>> reverse_indexes = {lst1[i]: index in xrange(len(lst1) - 1, -1, -1)}
then can lookup this
>>> [reverse_indexes[item] item in lst2 if item in reverse_indexes] [4, 8]
Comments
Post a Comment