I have two lists, let\'s say:
keys1 = [\'A\', \'B\', \'C\', \'D\', \'E\', \'H\', \'I\']
keys2 = [\'A\', \'B\', \'E\', \'F\', \'G\', \'H\',
By using only lists, you can achieve this with few simple for
loops and .copy()
:
def mergeLists(list1, list2):
# Exit if list2 is empty
if not len(list2):
return list1
# Copy the content of list2 into merged list
merged = list2.copy()
# Create a list for storing temporary elements
elements = []
# Create a variable for storing previous element found in both lists
previous = None
# Loop through the elements of list1
for e in list1:
# Append the element to "elements" list if it's not in list2
if e not in merged:
elements.append(e)
# If it is in list2 (is a common element)
else:
# Loop through the stored elements
for x in elements:
# Insert all the stored elements after the previous common element
merged.insert(previous and merged.index(previous) + 1 or 0, x)
# Save new common element to previous
previous = e
# Empty temporary elements
del elements[:]
# If no more common elements were found but there are elements still stored
if len(elements)
# Insert them after the previous match
for e in elements:
merged.insert(previous and merged.index(previous) + 1 or 0, e)
# Return the merged list
return merged
In [1]: keys1 = ["A", "B", "D", "F", "G", "H"]
In [2]: keys2 = ["A", "C", "D", "E", "F", "H"]
In [3]: mergeLists(keys1, keys2)
Out[3]: ["A", "B", "C", "D", "E", "F", "G", "H"]
English is not my first language, and this one is pretty hard to explain, but if you care about the explanation, here's what it does:
elements
which can store temporary elements.previous
which stores the previous element that was in both lists.list2
but is in list1
, it will append that element to elements
list and continue the loop.elements
list, appending all elements after previous
element to list2
.previous
and elements
is reset to []
and the loop continues.This way it will always follow this format:
So for example:
l1 = ["A", "B", "C", "E"]
l2 = ["A", "D", "E"]
A
will be first in the merged list.l1
between the previous common element A
and the new common element E
will be inserted right after A
.l2
between the previous common elmeent A
and the new common elmeent E
will be inserted right after the elements from l1
.E
will be last element.Back to step 1 if more common elements found.
["A", "B", "C", "D", "E"]