python - 我们如何创建返回 Set 而不是 tuple 或 list 的 Powerset
问题描述
我尝试创建函数来返回给定集的幂集。有很多示例,但所有示例都只是返回元组或列表,似乎无法转换为对象集。
from itertools import chain, combinations
def powerset(iterable):
"powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = set(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
g = [powerset({1,2,3})]
result = set(*g)
print(result)
无论如何我可以将结果转换为对象集吗?我期望结果 {{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3} }
解决方案
只需将其包装起来map(frozenset, ...)
即可将所有tuple
s转换frozenset
为相同值的 s:
def powerset(iterable):
"powerset([1,2,3]) --> frozenset() frozenset({1}) frozenset({2}) frozenset({3}) frozenset({1, 2}) frozenset({1, 3}) frozenset({2, 3}) frozenset({1, 2, 3})"
s = sorted(set(iterable)) # Sorted to get predictable ordering from combinations
return map(frozenset, chain.from_iterable(combinations(s, r) for r in range(len(s)+1)))
如果你没有得到set
所有结果,你可以使用map(set, ...)
,但是set
s 不是 another 的合法成员set
,虽然frozenset
是,所以map(frozenset, ...)
在这种情况下你想要什么。
请记住,set
(and frozenset
) 是任意排序的,因此结果可能与您期望的顺序不同,但它相当于您感兴趣的输出。
推荐阅读
- typescript - 为什么当我明确地将对象包装在“if”中时,TS 会抱怨该对象可能为空?
- c# - 如何在 C# 中比较整数和字符串?
- pdf - 标记顺序与阅读顺序 - 使用 Adobe Acrobat Pro 的 PDF 标记
- django - 替代 django 模板中的范围函数。TemplateSyntaxError:无法解析剩余部分
- html - 在制作这个模型时需要帮助
- python - python inside()中的查询结果并将其转换为整数?
- python - 在 PyCharm 中配置 Flask 应用程序的调试器:“UnicodeDecodeError: 'utf-8' codec can't decode byte”
- php - 在 Drupal-7 中将 entityform 字段数据传递给 API
- google-bigquery - 相对于 BigQuery 中的另一个数组列对一个数组列进行排序
- .net-core - Octopus Deploy 中特定于环境的配置