[英]Python - Find the biggest subset of a list of lists where no inner item is repeated
我有一个列表列表,其中每个子列表由四个项目组成,格式如下:
ll = [["dog", "cat", "mouse", "pig"],
["pidgeon", "goose", "rat", "frog"],
["bird", "dog", "mouse", "pig"]
["wolf", "cat", "whale", "rhino"]
...
["chameleon", "bat", "zebra", "lion"]
我需要找到没有重复字符串的内部列表的最大组合。 我的列表输出列表的格式应该与ll
相同,因此它应该是一个列表列表,其中每个子列表由四个字符串组成。 所以我想要的输出将排除["dog", "cat", "mouse", "pig"]
(第一个子列表),因为它与["bird", "dog", "mouse", "pig"]
(第三个子列表) 和带有["wolf", "cat", "whale", "rhino"]
的条目 "cat" (第四个子列表)。 至关重要的是,我想要的输出不会排除第三个和第四个子列表,尽管那将是没有重复字符串的内部列表的组合,因为它不会是最大的组合。
目前,我遵循了两个选项,它们在两种不同的方式中都是不可取的:
选项1
output = []
for comb in itertools.combinations(ll, 40):
merged = set(itertools.chain.from_iterable(comb)) # flatten nested list
if len(merged) == 160: # 40*4 = 160 --> no item is repeated
output.append(comb)
这个选项的缺点是 (a) 它在计算上根本没有效率,并且 (b) 我会先验地指定我的目标内部列表的数量,而不是最大化它。
选项 2
items = set()
unique = []
for quartet in ll:
if set(quartet).isdisjoint(items):
unique.append(quartet)
for word in quartet:
items.add(word)
print(unique)
此选项的缺点是,虽然它返回一个满足我的约束(非重复)的列表,但它不会返回最大的列表,并且输出是顺序敏感的。
您可以通过一些预处理和贪婪方法来使用第二种方法。
ll
所有元素并将所有唯一元素及其计数存储在 dict 中。{
"dog": 1,
"cat": 2,
...
}
ll
每个列表,您可以找出有多少元素重叠(您可以检查 dict 中该元素的值是否大于 1)并存储该计数。sorted()
函数根据重叠计数对ll
进行sorted()
。ll
上运行你的第二个方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.