将两个列表合并为一个没有重复元素的保持顺序

时间:2016-03-21 10:13:52

标签: algorithm list merge

我有两个列表,我想将它们合并在一起。假设它们为list_leftlist_right 合并规则是:

  1. 两个列表没有重复元素,合并结果列表没有重复元素。
  2. 合并中元素的顺序必须与list_leftlist_right中的相同。
  3. 如果两个元素(e1e2)同时出现在list_leftlist_right中,并且list_left和{{{{}}}中的元素顺序不同1}}。它必须保持list_right中的顺序。换句话说,如果list_right位于e1中的e2之前,list_right必须位于合并列表中e1之前,无论e2中的list_left如何}}。
  4. 如果上述三条规则中未提及某些元素,则它们可以出现在结果合并列表中的任何位置。
  5. 一些例子:

    list_left:   w  h  i  j  k 
    list_right:  a  w  t  i  n
    merged:      a  w  h  t  i  j  k  n
    
    
    list_left:   w  h  i  j  k 
    list_right:  j  w  m  n  a
    merged:      j  w  h  i  k  m  n  a
    
    
    list_left:   j  w  m  n  a
    list_right:  w  h  i  j  k 
    merged:      w  h  i  j  m  n  a  k
    
    
    list_left:   a  b  c  d 
    list_right:  e  f  g  h
    merged:      a  b  c  d  e  f  g  h
    

    有任何方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

只需复制list_left中尚未加入list_merged的元素。但是当您在list_left中看到list_right而不是list_merged中的元素时,请将list_right中的元素复制到此元素。完成list_left后,复制list_right中剩余的内容:

list_left = "whijk"
list_right = "jwmna"
list_merged = ""
pos = 0

for x in list_left:
  if not x in list_merged:
    if x in list_right:
      xpos = list_right.index(x)
      list_merged += list_right[pos:xpos]
      pos = xpos + 1
    list_merged += x
list_merged += list_right[pos:]

print list_merged

为了提高性能,您可以创建一对集合,并通过在这些集合中搜索来替换列表中的搜索。