求多个集合交集的最大长度的pythonic方法?
我想得到每个子集的最大交集长度的子集与总元素的交集,我想知道如何用简单的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() 很抱歉让人困惑,我试图实现贪婪算法来解决最大覆盖率问题。对于每个步骤,在排除当前选择的子集之后,我希望找到覆盖最多
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同意。还不完全清楚。与直觉相反,对于此类问题,我们可能需要在接受答案后编辑问题!