求多个集合交集的最大长度的pythonic方法?

求多个集合交集的最大长度的pythonic方法?,python,set,Python,Set,我想得到每个子集的最大交集长度的子集与总元素的交集,我想知道如何用简单的pythonic方式编码?如果有人能帮忙,非常感谢 max_subset = max(subsets, key=len(elements.intersection(e) for e in subsets)) TypeError: object of type 'generator' has no len() 很抱歉让人困惑,我试图实现贪婪算法来解决最大覆盖率问题。对于每个步骤,在排除当前选择的子集之后,我希望找到覆盖最多

我想得到每个子集的最大交集长度的子集与总元素的交集,我想知道如何用简单的pythonic方式编码?如果有人能帮忙,非常感谢

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

TypeError: object of type 'generator' has no len()
很抱歉让人困惑,我试图实现贪婪算法来解决最大覆盖率问题。对于每个步骤,在排除当前选择的子集之后,我希望找到覆盖最多未覆盖元素的子集。为了找到这个子集,我需要将剩余的子集与宇宙集相交,在这些未覆盖的交点中,选择最长的一个。子集的结果应涵盖宇宙集合中元素的最大数量,以及内部交点中元素的最小数量


再次感谢你们每一个人

除了在生成器上调用len之外,您的代码中似乎还有另一个逻辑错误。假设您有一些set
元素

elements = {'a', 'b', 'c', 'd', 'e'}
你有这个集合的子集,比如说:

subsets = [{'a', 'b'}, {'a'}, {'c'}]
…其中,子集是一个集合,由
元素
集合的元素创建。 然后,最大交集的子集(这意味着:与
元素
集合相同的元素数最多的子集)就是元素数最多的子集。因此:

max_subset = max(subsets)  
# and that is {'a', 'b'}
请注意,只有在集合
元素
的所有子集的集合中,才有“最大子集”的子集,并且它总是
元素
本身。在其他情况下,可能会出现如下情况:

subsets = [{'a', 'b'}, {'b', 'c'}]
other_elements = {'a', 'b', 'c', 'd', 'e'}
有两个
maximum
子集,但没有
maximust
子集。查阅参考资料

但是,如果您对比较初始集的子集以外的内容不感兴趣,那么假设您有一些set
其他元素
,如下所示:

subsets = [{'a', 'b'}, {'b', 'c'}]
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'}

除了在生成器上调用len之外,您的代码中似乎还有另一个逻辑错误。假设您有一些set
元素

elements = {'a', 'b', 'c', 'd', 'e'}
你有这个集合的子集,比如说:

subsets = [{'a', 'b'}, {'a'}, {'c'}]
…其中,子集是一个集合,由
元素
集合的元素创建。 然后,最大交集的子集(这意味着:与
元素
集合相同的元素数最多的子集)就是元素数最多的子集。因此:

max_subset = max(subsets)  
# and that is {'a', 'b'}
请注意,只有在集合
元素
的所有子集的集合中,才有“最大子集”的子集,并且它总是
元素
本身。在其他情况下,可能会出现如下情况:

subsets = [{'a', 'b'}, {'b', 'c'}]
other_elements = {'a', 'b', 'c', 'd', 'e'}
有两个
maximum
子集,但没有
maximust
子集。查阅参考资料

但是,如果您对比较初始集的子集以外的内容不感兴趣,那么假设您有一些set
其他元素
,如下所示:

subsets = [{'a', 'b'}, {'b', 'c'}]
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'}

这可能就是您正在寻找的:

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

这可能就是您正在寻找的:

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

举个例子可以帮助我们了解您在寻找什么。请看,你想达到什么目标还不太清楚。子集是从其他初始集合的元素创建的集合。子集越大,它与初始集的交集就越大。所以,若你们用初始集求交,那个么它是毫无意义的,因为你们只需要测量每个子集的元素数,就知道哪个元素有最大的交集。举个例子,我们就可以了解你们在找什么。请看,你想达到什么目标还不太清楚。子集是从其他初始集合的元素创建的集合。子集越大,它与初始集的交集就越大。所以,如果你在和初始集求交,这是毫无意义的,因为你所需要的只是测量每个子集的元素数,以知道哪个有最大的交集。我想说,OP答案的解决方案应该在结果中找到一个集合,而不是元素数,但实际上并不完全清楚。@erhesto,同意。还不完全清楚。与直觉相反,对于此类问题,我们可能需要在接受答案后编辑问题!我想说OP答案的解决方案应该是在结果中找到一个集合,而不是元素的数量,但事实上这并不完全清楚。@erhesto同意。还不完全清楚。与直觉相反,对于此类问题,我们可能需要在接受答案后编辑问题!