【发布时间】:2020-11-16 18:28:49
【问题描述】:
我有一个系列封面问题要解决,我希望将系列名称返回给我。我认为存储命名集的好方法是在字典中。 我发现了这个blog,它实现了算法但使用了一个集合列表,我正在尝试修改代码以适应字典。
def set_cover2(universe, subsets):
"""Find a family of subsets that covers the universal set"""
elements = set(e for s in subsets for e in subsets[s])
# Check the subsets cover the universe
if elements != universe:
return None
covered = set()
cover = []
# Greedily add the subsets with the most uncovered points
while covered != elements:
subset = max(subsets.values(), key=lambda s: len(s - covered))
cover.append(subset)
covered |= subset
return cover
这会将集合作为列表返回:
universe = set(range(1, 11))
subsets = {"s1":set([1, 2, 3, 8, 9, 10]),
"s2":set([1, 2, 3, 4, 5]),
"s3":set([4, 5, 7]),
"s4":set([5, 6, 7]),
"s5":set([6, 7, 8, 9, 10])}
cover = set_cover2(universe, subsets)
print(cover)
即
[{1, 2, 3, 8, 9, 10}, {4, 5, 7}, {5, 6, 7}]
但不是名字。
要获得名称,我不能使用集合的值来识别名称,因为在我的实际数据中,某些子集可能是相同的(我猜在这种情况下,两者都可以)。无论如何,我想要一个返回每个选定集合名称的解决方案。
我想这必须通过修改subset = max(subsets.values(), key=lambda s: len(s - covered)) 行来实现,但我不确定如何在保留算法集的同时获取从此操作中选择的集的名称。我该怎么做?
期望的输出:
["s1", "s3", "s4"]
【问题讨论】:
标签: python dictionary set set-cover