【发布时间】:2021-08-28 18:33:15
【问题描述】:
假设我有一个包含复制者的数字列表。
import random
lst = [0, 0, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 6, 7, 7, 8, 8, 8, 9]
random.shuffle(lst)
我想将列表分成最少数量的子“集”,其中包含所有唯一数字,不丢弃任何数字。我设法写了下面的代码,但我觉得这是硬编码的,所以应该有更快更通用的解决方案。
from collections import Counter
counter = Counter(lst)
maxcount = counter.most_common(1)[0][1]
res = []
while maxcount > 0:
res.append(set(x for x in lst if counter[x] >= maxcount))
maxcount -= 1
assert len([x for st in res for x in st]) == len(lst)
print(res)
输出:
[{4}, {8, 2, 4}, {0, 2, 3, 4, 7, 8}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}]
显然,这只是其中一种解决方案。另一种解决方案可能是
[{4, 9}, {8, 2, 4}, {0, 2, 3, 4, 7, 8}, {0, 1, 2, 3, 4, 5, 6, 7, 8}]
我想用最少的子“集”(在本例中为 4 个)找到所有可能的解决方案。请注意,相同的数字是无法区分的,例如对于[1, 2, 1] 的列表,[{1}, {1, 2}] 与 [{1, 2}, {1}] 的解决方案相同。
有什么建议吗?
【问题讨论】:
-
为什么
[{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}]不是解决方案?我在您写的内容中找不到任何可以解释为什么结果必须包含 4 个集合的原因。 -
我说的是没有丢弃任何数字
-
您是否真的需要枚举所有可能的解决方案(如标题所述),或者可能解决方案的数量是否足够?
-
@BuddyBob 实际上没有烤过。句子模棱两可。 “任何数字”可以是“不丢弃唯一数字(数字)”,也可以表示“原始列表的每个成员都必须恰好在一个结果集中”。英语表达的精确性使一切变得不同。此外,正如 TimPeters 所提到的,没有明确要求产生四组。
-
我想要所有可能的解决方案,这是最难的部分。
标签: python list algorithm set subset