【问题标题】:Python - Find the biggest subset of a list of lists where no inner item is repeatedPython - 查找列表列表中没有重复内部项目的最大子集
【发布时间】: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)

这个选项的缺点是虽然它返回一个满足我的约束(不重复)的列表,但它不会返回最大的一个并且输出是顺序敏感的。

【问题讨论】:

    标签: python list


    【解决方案1】:

    您可以使用带有一点预处理和贪婪方法的第二种方法。

    • 首先,您可以遍历ll 中的所有元素,并将所有唯一元素及其计数存储在一个字典中。
    {
      "dog": 1,
      "cat": 2,
      ...
    }
    
    • 然后对于ll 中的每个列表,您可以找出有多少元素重叠(您可以检查该元素在 dict 中的值是否大于 1)并存储该计数。
    • 现在您可以使用sorted() 函数根据重叠计数对ll 进行排序。
    • 现在您可以在已排序的ll 上运行您的第二种方法

    【讨论】:

      猜你喜欢
      • 2023-01-02
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 2021-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      相关资源
      最近更新 更多