首页 > 解决方案 > 检查列表是否按自定义顺序

问题描述

我正在尝试验证一个列表说:

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

我现在能做的最多就是删除重复和额外的元素。我不想使用自定义列表对它们进行排序。我只需要验证订单。我所做或至少尝试过的是创建一个字典,其中值是订单的索引。谁能指出我正确的方向?

标签: python-3.xlistpython-3.6

解决方案


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 Falsein okay,它会失败。如果某个地方出现了额外的元素,则会与None(感谢zip_longest)进行比较,并且 aFalse会再次出现 in okay

这可以通过使用集合来提高成员资格查找速度。


推荐阅读