繁体   English   中英

Python - 查找没有重复内部项目的列表列表的最大子集

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM