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。
请建议任何方法。
答案 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}}上面。