python-3.x - 检查列表是否按自定义顺序
问题描述
我正在尝试验证一个列表说:
X = ['a','c', 'c', 'b', 'd','d','d']
针对自定义有序列表:
Y = ['a',b','d']
在这种情况下,针对 Y 验证的 X 应该返回True
,而不管其中是否有额外的元素和重复项,只要它符合顺序Y
并包含至少两个元素。
案例示例:
X = ['a','b'] # Returns True
X = ['d','a', 'a', 'c','b'] # Returns False
X = ['c','a','b', 'b', 'c'] # Returns True
我现在能做的最多就是删除重复和额外的元素。我不想使用自定义列表对它们进行排序。我只需要验证订单。我所做或至少尝试过的是创建一个字典,其中值是订单的索引。谁能指出我正确的方向?
解决方案
from itertools import zip_longest, groupby
okay = list(x == y for y, (x, _) in zip_longest(
(y for y in Y if y in X), groupby(x for x in X if x in Y)))
print(len(okay) >= 2 and all(okay))
首先,我们从两个列表中丢弃不必要的元素。然后我们可以使用groupby
折叠相同元素的序列X
。例如,您的第一个示例['a', 'c', 'c', 'b', 'd', 'd', 'd']
首先变为['a', 'c', 'c', 'b'] (by discarding the unnecessary
'd' ), then
[('a', _), ('c', _), ('b', _)]。如果我们逐个元素地将它的键与Y
没有不必要位的键进行比较,并且其中至少有 2 个,我们就有一个匹配项。如果违反了顺序(例如['b', 'c', 'c', 'a', 'd', 'd', 'd']
,会有 a False
in okay
,它会失败。如果某个地方出现了额外的元素,则会与None
(感谢zip_longest
)进行比较,并且 aFalse
会再次出现 in okay
。
这可以通过使用集合来提高成员资格查找速度。
推荐阅读
- python - Python Pandas 比较 DataFrame 单元格中的日期时间值
- azure - Azure Front Door 是否支持 TLS 客户端身份验证
- android - ActivityThread.handleDestroyActivity 中的“DecorView 未附加到窗口管理器”问题
- javascript - Vue-Multiselect - 取消选择一组预加载值不起作用
- vba - 在运行宏之前等待文档完全打开
- gremlin - 当 Gremlin 参数的名称包含空格时,有没有办法转义它?
- angular - 如何在 ngOnInit() 中设置单选按钮 FormControl 的默认值
- ios - 使用 ASWebAuthenticationSession 连接 Strava 帐户失败
- javascript - div更改元素属性的光标接近度
- modelica - 如何在Modelica中计算复杂矩阵的特征向量和特征值?