检查子列表是否存在于另一个列表中

To check if sublist exists in another list

coll = [[3, 3], [2, 2, 2], [2, 4], [2, 3], [2, 2]]
main = [4, 3, 3, 2, 2, 2, 2, 2, 2, 2]

我有 2 个列表。 'coll' 是一个列表列表,每个子列表包含可能有重复的整数(例如 [2, 2, 2])。 main 是一个包含整数的列表。我想检查 'coll' 的子列表元素是否存在于 'main' 中。对于这种情况,这是真的,因为存在 [2, 2, 2]、[3, 3] 和其他子列表。子列表中元素的顺序和 'main' 无关紧要。无论子列表中存在什么元素,它们都可能出现在 'main' 中的任何位置。

我不能使用集,因为存在重复项。而且我也不能使用字符串,因为:

coll = ['222']
main = ['423262']

我使用了一个子列表示例来说明使用字符串的问题。我的算法要求是,在这种情况下,还返回 'true',因为“2”出现在 3 个位置,索引 1、2、5。但是:

if coll in main:
    return True
else:
    return False

如果我使用字符串进行检查,则此 returns 为 false。

请提出任何方法。

我认为最易读的方法是为每个子列表创建一个 Counter 实例,然后它们检查列表 "count" 方法是否符合子列表每个参数的要求:

from itertools import Counter

def checksub(main, sublist):
    c = Counter(sublist)
    for num, count in c.items():
        if main.count(num) < count:
            return False
    return True

all(checksub(main, sublist) for sublist in coll)

这并不快 - 如果您正在迭代大量数据,您最好使用某种方法将 "main" 列表映射到一个数据结构中,这样可以更快地检查计数使用 "count" 的方式 tahn。或者,如果不同的数字很少,甚至像为每个不同的数字缓存 "count" 的 returns 这样简单的事情。 否则对于 "main" 的小尺寸,这可能就足够了。

第二次阅读您的问题时,您似乎只需要 main 中存在一个子列表 - 如果是这种情况,只需将对 all 的调用替换为any 以上。