【问题标题】:finding missing name from two lists从两个列表中查找缺少的名称
【发布时间】:2020-02-17 12:16:39
【问题描述】:

这是一个说明情况的示例。 假设我们有两个包含一些名称的列表。我称它们为原始 (O) 和修改 (M) 列表。注意,M 有遗漏的名字。我无法访问 O,但我可以访问 M。我从 O 获得的是一个列表,我称之为 O1,它遵循两个条件:(1)在重复的情况下,只有最近的名称应该可以考虑,(2)O1的顺序是O的LIFO。

例如,假设原始列表包含 O={n1,n2,n3,n2,n1,n3,n1,n3} 其中 n1 是第一个在第一、第五和第七位写下自己名字的人.所以,我所拥有的是 O1={n3,n1,n2},这两个条件都适用。现在,修改后的列表包含 M={n2,n3,n2,n1,n3,n1} (两个名称已被删除(n1,n3)),通过遵循这两个条件,我可以创建 M1={n1,n3, n2}。通过比较 O1 和 M1

O1={n3,n1,n2}

M1={n1,n3,n2}

我可以找到 n3 作为缺少的名称,因为 n3 的位置已在我生成的列表 (M1) 中被修改。

如何将 n1 作为缺失的名称?

【问题讨论】:

  • 您是否有权访问任何其他结构或信息?您似乎无法从您的示例中区分 O={n1,n2,n3,n2,n1,n3,n1,n3} 或 O={n3,n2,n3,n2,n1,n3, n1,n3},因为任何一个都可以满足 O1 的构造方式。
  • 我知道 O 中出现了多少个名字,在这个例子中是 8,有多少对 O 隐藏,在这个例子中是 2 个名字,但我无权访问 O。我只有O1、M 和我按照这两个条件创建 M1。

标签: python algorithm list


【解决方案1】:

我认为这是不可能的,除非您可以访问比问题中所述更多的信息。如果仅与 O1 进行比较,则 O 中缺少的起始元素将无法识别,前提是最后的重复序列相同。

例如,令 M = {1, 2, 3}。考虑不同可能的 O 列表的几个实例。

  • (A) O = {1, 1, 2, 3},其中 M 缺少 1
  • (B) O = {2, 1, 2, 3},其中 M 缺失 2
  • (C) O = {3, 1, 2, 3},其中 M 缺失 3

上述所有 O 列表在您的约束下都会产生 O1 = {3, 2, 1}。因此,仅考虑 O1 和 M 可以使用,甚至 O 中缺少的元素数量,没有办法从上述情况中区分出哪些开始元素丢失了。为 A、B、C 提供的输入是相同的。

【讨论】:

  • 我认为不可能的一个很好的论点。
【解决方案2】:

这可以通过使用双端队列作为 LIFO 来提供

from collections import deque

class lifo(): # LIFO
  """ Use lifo class to implement condition 
      2) the order of elements is a LIFO """
  def __init__(self, iterable=None):
    if iterable is None:
      self.queue = deque()
    else:
      self.queue = deque()
      for item in iterable:
        self.add(item)

  def add(self, item):
    """ Condition (1) in the case of repetition,
        only the most recent name should be 
        considered if item in self.queue: so 
        remove if item alredy in lifo """
    if item in self.queue:
      self.queue.remove(item)
    self.queue.append(item)

  def get(self):  # reverse since deque shows items in reverse order
    return reversed(self.queue)

  def __str__(self):
    return str(list(reversed([k for k in self.queue])))


O1 = ['n1','n2','n3','n2','n1','n3','n1','n3']
M = ['n2','n3','n2','n1','n3','n1']

# Place O1 & M in LIFO
q1 = lifo(O1)
q2 = lifo(M)

# Detect changes in position
changes = [x for x, y in zip(q1.get(), q2.get()) if x != y]
print(changes)
print(q1)
print(q2)

输出

changes: ['n3', 'n1'] => Missing names (change in position)
q1: ['n3', 'n1', 'n2'] => lifo(O1)
q2: ['n1', 'n3', 'n2'] => lifo(M)

【讨论】:

  • 感谢您的回答。编译代码时收到错误消息。错误是: ValueError: deque.remove(x): x not in deque
  • @sezarsampaio--对不起,但奇怪的是我的代码中缺少一行(即,如果 self.queue 中的项目:)。一定是在我编辑提交到 StackOverflow 时发生的。
  • @sezarsampaio——当然。但是,它有帮助吗?
  • 谢谢@DarrylG。您的代码非常适合此示例,但这只是示例。因此,如果您将 O1 和 M 更改为 O1 = ['n4','n6','n5','n3','n1','n2'] M = ['n6','n4',' n5','n1','n3','n2'],那么代码将产生 ['n1', 'n3', 'n6', 'n4'] 作为更改。请注意,此示例中缺少名称的数量为 3。
猜你喜欢
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多