pythonic方式找到多组交集的最大长度?

时间:2018-01-29 10:45:03

标签: python set

我想得到每个子集的最大交叉长度的子集与总元素相交,我想知道如何以简单的pythonic方式编码?非常感谢,如果有人可以提供帮助。

max_subset = max(subsets, key=len(elements.intersection(e) for e in subsets))

TypeError: object of type 'generator' has no len()

抱歉令人困惑,我试图实现解决最大覆盖问题的贪婪算法。对于每个步骤,在排除当前选择的子集之后,我想找到覆盖最多未覆盖元素的子集。为了找到这个子集,我需要将剩余的子集与宇宙集相交,在这些未被覆盖的交叉点中,将选择最长的交叉点。子集的结果应该涵盖Universe集中的最大元素数,并且内部交叉点中的元素数量最少。

再次感谢大家!

2 个答案:

答案 0 :(得分:1)

除了在生成器上调用len之外,您的代码中似乎还有另一个逻辑错误。让我们说,你有一些elements集:

elements = {'a', 'b', 'c', 'd', 'e'}

你有这个集合的子集,让我们说:

subsets = [{'a', 'b'}, {'a'}, {'c'}]

...其中子集是一个集合,它是根据elements集合的元素创建的。 然后,最大交集的子集(这意味着:与elements集合具有最大数量的元素的那个)是具有最多元素的那个。所以:

max_subset = max(subsets)  
# and that is {'a', 'b'}

请注意,只有在集合elements的所有子集的集合中,您才有子集,即#34;最大子集"它总是elements本身。在其他情况下,可能会出现这样的情况:

subsets = [{'a', 'b'}, {'b', 'c'}]

并且有两个maximum子集,但没有greatest子集。查看this以获取参考。

但是,如果你对比较初始集的子集以外的其他内容不感兴趣,那么让我们说你有一些看似如下的other_elements集:

other_elements = {'a', 'b', 'c', 'd', 'e'}

要与之比较的集合列表,寻找具有最大交集的集合:

list_of_sets = [{'a', 'b', 'x'}, {'c', 'z'}, {'c', 'd', 'e', 'w'}]

这样做的正确方法是:

max(list_of_sets, key=lambda x: len(elements.intersection(x)))

...结果是:{'c', 'd', 'e', 'w'}

答案 1 :(得分:1)

这可能就是你要找的东西:

mainset = {1, 2, 3, 4}
subsets = [{1, 2}, {3, 2, 1}, {1}]

max(map(len, map(mainset.intersection, subsets)))  # 3

有时嵌套的map会让人感到困惑,在这种情况下有一些替代方案。

撰写功能:

from toolz import compose
max(map(compose(len mainset.intersection), subsets))  # 3

列表理解:

max(len(mainset.intersection(subset)) for subset in subsets)  # 3