首页 > 解决方案 > 从两个列表中查找缺少的名称

问题描述

这是一个说明情况的例子。假设我们有两个包含一些名称的列表。我称它们为原始 (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 作为缺少的名称?

标签: pythonalgorithmlist

解决方案


这可以通过使用 deque 作为 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)

推荐阅读