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

时间:2015-06-09 15:36:58

标签: list python-3.x sublist

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'是一个列表列表,每个子列表包含可能有重复的整数(ex- [2,2,2])。 main是一个包含整数的列表。我想检查一下'的子列表元素是否正确。存在于' main'或不。对于这种情况,由于存在[2,2,2],[3,3]和其他子列表,因此确实如此。子列表和' main'中元素的顺序。无所谓。无论子列表中存在哪些元素,它们都可能出现在“主要”列表中。在任何位置。

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

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

我使用了子列表示例来显示使用字符串的问题。我的算法要求是在这种情况下也是真的'是因为' 2'存在于3个位置,索引-1,2,5。但是:

if coll in main:
    return True
else:
    return False

如果我使用字符串进行检查,则返回false。

请建议任何方法。

1 个答案:

答案 0 :(得分:2)

我认为最可读的方法是为每个子列表创建一个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中存在其中一个子列表 - 如果是这种情况,只需将all的调用替换为{any 1}}上面。