efficient list merging

Ken Seehof kseehof at neuralintegrator.com
Tue Sep 3 22:27:53 CEST 2002


> [Peter Saffrey]
>
> > I have two lists of lists of strings which I would like to merge
> > efficiently without repeats.  [...] Or is there a better way?
>
> I am not sure about the relative speed of everything, but I would be
> tempted to try:
>
>    dict(zip(list1 + list2, [None] * (len(list1) + len(list2)))).keys()
>
> It seems to work:
>
> >>> list1 = list('abcdebxyz')
> >>> list2 = list('pqqr')
> >>> list1
> ['a', 'b', 'c', 'd', 'e', 'b', 'x', 'y', 'z']
> >>> list2
> ['p', 'q', 'q', 'r']
> >>> dict(zip(list1 + list2, [None] * (len(list1) + len(list2)))).keys()
> ['a', 'c', 'b', 'e', 'd', 'q', 'p', 'r', 'y', 'x', 'z']
>
> --
> François Pinard   http://www.iro.umontreal.ca/~pinard

This is a bit faster, but assumes that the first list does not initially
contain duplicates.  It eliminates duplicates that would be introduced by
merging items from list2.  Also, this maintains the original list order
(i.e. list1+list2 without adding duplicates).

def merge(list1,list2):
    d1 = dict(zip(list1,list1))
    return list1+[s for s in list2 if s not in d1]

- Ken Seehof





More information about the Python-list mailing list