如何测试列表切片是否按任意顺序与一组值匹配



例如,如果我有一个像 [a,b,c,d] 这样的列表,我需要检查索引 1,2 处的元素是 b 还是 c,那么它就是真的。例如,在 [a,b,c,d] 中,在索引 1 处有一个"b",在索引 2 处有一个返回 true的"c"。但是,如果这些索引中的元素不是 b 和 c 的组合,则为 false。因此,索引 1 和 2 中必须有"b"或"c",不能是 (b 和 b( 或 (c 和 c(。我不知道如何比较这个..有什么提示吗?

[a,b,c,d] 为 True,因为索引 1 和 2 中的元素包含 b 或 c 的组合

对此的一般解决方案是使用集合成员资格。 所以你可以这样:

s = set(vals[1:3])
if s == set(["b", "c"]):
    ...

这将从 vals[1]vals[2] 创建一个集合,并检查该集合是否完全包含元素 "b""c"

你可以

为此使用Counter,假设你感兴趣的类型是可哈希的。

from collections import Counter
def check_counts(l, compare_to):
    return Counter(l) == Counter(compare_to)
l = ['a', 'b', 'c', 'd']
print(check_counts(l[1:3], ['c', 'b']))

这类似于使用 set 的解决方案,但允许您关心某个元素的数量的情况

给定要匹配的项目列表和切片:

items = ['a', 'b', 'c', 'd']
match = ['b', 'c']

您所需要的只是:

matches = items[1:3] in (match, match[::-1])

注意:match[::-1]返回 match 的反转版本。

基于集的替代版本:

match = set(('b', 'c'))
# Version 1
matches = match.intersection(items[1:3]) == match
# Version 2
matches = not match.difference(items[1:3])

最新更新