【问题标题】:Merge two list into a single keeping order without duplicate element将两个列表合并为一个没有重复元素的保持顺序
【发布时间】:2016-07-07 19:03:48
【问题描述】:

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

  1. 两个列表没有重复元素,合并结果列表没有重复元素。
  2. 合并后的元素顺序必须与list_leftlist_right一致。
  3. 如果两个元素(e1e2)同时出现在list_leftlist_right中,并且它们在list_leftlist_right中的顺序不同。它必须保持list_right 中的顺序。换句话说,如果e1list_right中在e2之前,那么e1在合并列表中必须在e2之前,不管它们在list_left中如何。
  4. 如果上面三个规则中没有提到某些元素,它们可以出现在结果合并列表中的任何位置。

一些例子:

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

有什么方法可以解决这个问题吗?

【问题讨论】:

  • 如果有任何问题,请@我,我会修正描述。

标签: algorithm list merge


【解决方案1】:

只需从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

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

【讨论】:

  • list_left = "obxyhruz", list_right = "ryz"时不起作用,结果必须是"obxhryuz",而不是"obxryhuz"。因为'h'和'r'的顺序必须和list_left一样,根据规则2。规则3只影响'r'和'y'的冲突顺序
  • 如果我正确理解规则,规则 2 规定 'h' 位于 'r' 之前,同样的规则规定 'h' 位于 'y' 之后。规则 3 还要求在 'y' 之前有 'r'。由于不能同时满足所有这些条件,因此我们需要详细分析这里适用哪些规则。规则 3 中没有矛盾。但是规则 2 对“h”有什么说法呢?它只是不适用于'h'。这意味着“h”的唯一有效规则是规则 4。我们可以为“h”选择任何位置。
  • 如你所说,'h'的唯一有效规则是规则4。我的错误,我将修改问题中的示例,并接受你的答案。
猜你喜欢
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2018-09-11
  • 2018-11-27
  • 2019-06-08
  • 1970-01-01
  • 2012-04-12
  • 2012-04-17
相关资源
最近更新 更多