我想得到每个子集的最大交叉长度的子集与总元素相交,我想知道如何以简单的pythonic方式编码?非常感谢,如果有人可以提供帮助。
max_subset = max(subsets, key=len(elements.intersection(e) for e in subsets))
TypeError: object of type 'generator' has no len()
抱歉令人困惑,我试图实现解决最大覆盖问题的贪婪算法。对于每个步骤,在排除当前选择的子集之后,我想找到覆盖最多未覆盖元素的子集。为了找到这个子集,我需要将剩余的子集与宇宙集相交,在这些未被覆盖的交叉点中,将选择最长的交叉点。子集的结果应该涵盖Universe集中的最大元素数,并且内部交叉点中的元素数量最少。
再次感谢大家!
答案 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