python - 从两个列表中查找缺少的名称
问题描述
这是一个说明情况的例子。假设我们有两个包含一些名称的列表。我称它们为原始 (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 作为缺少的名称?
解决方案
这可以通过使用 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)
推荐阅读
- php - 未定义的变量:在 laravel 6
- java - 从 ArrayList 中删除异常值
- python - 使用 slug 和基于类的视图时找不到视图
- javascript - 从网站抓取和获取不同项目的最快方法是什么
- javascript - 在JS中捕获同站点页面转换的URL
- java - 微服务与 Feign、OAuth2 和 Spock 的集成测试
- tensorflow - 如何让 TensorFlow 使用 100% 的 GPU?
- c# - 在 object.instantiate (Unity) 之后音频不会立即播放
- javascript - 为什么 JSLint 会警告我我的 switch-case 语句格式不正确?
- varnish-vcl - 如何在 VCL 4.0 中重现 VCL 3.0 vcl_recv / restart 的行为