这是一个说明情况的例子。
假设我们有两个包含一些名字的列表。我称之为原始(O)和修改(M)列表。注意,m漏掉了名字。我没有访问O的权限,但我有访问M的权限。从O得到的是一个列表,我称之为O1,它遵循两个条件:(1)在重复的情况下,只应考虑最新的名称,(2)O1的顺序是O的后进先出。
例如,假设原始列表包含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)中被修改了。
我怎么能抓到一个失踪的名字?

最佳答案

这可以通过使用deque作为后进先出法来提供

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)

关于python - 从两个列表中查找丢失的名字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58485763/

10-11 18:10