【发布时间】:2020-11-24 14:13:40
【问题描述】:
我有一个列表列表,其中每个子列表由四个项目组成,格式如下:
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"]共享项目“猫”(第四个子列表)。至关重要的是,我想要的输出将 not 排除第三个和第四个子列表,尽管这将是没有重复字符串的内部列表的组合,因为它会 not最大的组合。
目前,我遵循了两种选择,但在两种不同的方式中都是不可取的:
选项 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)
这个选项的缺点是虽然它返回一个满足我的约束(不重复)的列表,但它不会返回最大的一个并且输出是顺序敏感的。
【问题讨论】: