检查一个列表是否是另一个没有重复的python的子集



我有一个大列表(~200,000 个元素(和另一个大小为 1-9 的列表。我需要在大列表中找到小列表的最长排列。所以我需要找出小列表是否是大列表的子集,没有重复(即 [a,a] 是 [a,b,c] 的子集应该返回 False(。有没有办法做到这一点?

我已经尝试过 .issubset,但这对于重复项返回 true。我也尝试检查小列表的每个排列,但这太慢了。

似乎你需要一个多集(正如你使用 set 所建议的那样(,Python 通过集合提供了它自己的多集实现。计数器,所以使用它:

from collections import Counter
short = ['a','a']
large =  ['a','b','c']
short_counts = Counter(short)
large_counts = Counter(large)
print(all(value <= large_counts.get(key, 0) for key, value in short_counts.items()))

输出

False

将所有内容放入一个函数中并添加一些示例,我们得到:

def sub_multi_set(sh, la):
short_counts = Counter(sh)
large_counts = Counter(la)
return all(value <= large_counts.get(key, 0) for key, value in short_counts.items())

print(sub_multi_set(['a', 'a'], ['a', 'b', 'c']))
print(sub_multi_set(['a'], ['a', 'b', 'c']))
print(sub_multi_set(['a', 'a'], ['a', 'a', 'a', 'b', 'c']))
print(sub_multi_set(['a', 'b'], ['a', 'b', 'c']))
print(sub_multi_set(['d', 'b'], ['a', 'b', 'c']))

输出

False
True
True
True
False

最新更新