我有一个自定义类 Fun 的元素列表。我想要的是生成这个列表的所有可能的总和。 例如,如果我有列表 [Fun1, Fun2, Fun3],我想生成列表:
[[Fun1 + Fun2, Fun3], [Fun1 + Fun3, Fun2], [Fun2 + Fun3, Fun1], [Fun1, Fun2, Fun3], [Fun1 + Fun2 + Fun3]]
这应该生成更长的列表,但我知道列表中的所有元素都具有相同的类型,一个名为 Fun 的自定义类。并且可以对 Fun 类的元素求和,我已经实现了它们应该求和的方式。
我尝试了多种方法来生成可能求和的列表,主要使用 itertools.combinations 和 itertools.product 的变体,但没有成功。我也尝试过列表理解(诸如
[[x + y for x in my_list if x != y] for y in my_list]
之类的东西)但没有成功。通常,我会遇到“Fun 类型不可迭代”之类的错误,或者我的输出只有一个元素(原始元素)。
more-itertools
软件包,这非常容易。
所以,首先,安装它:
>>> pip install more-itertools
现在您可以非常轻松地执行您要求的操作。由于我没有你对类
Fun
的定义,让我用整数做一个例子。请记住,您的课程必须支持元素求和。这部分由您来定义。
from more_itertools import set_partitions
lst = [1, 2, 3]
partitions = [
part
for k in range(1, len(lst) + 1)
for part in set_partitions(lst, k)
]
partition_sums = [
[sum(p) for p in part]
for k in range(1, len(lst) + 1)
for part in set_partitions(lst, k)
]
>>> partitions
[[[1, 2, 3]], [[1], [2, 3]], [[1, 2], [3]], [[2], [1, 3]], [[1], [2], [3]]]
>>> partition_sums
[[6], [1, 5], [3, 3], [2, 4], [1, 2, 3]]
如果您不想安装该软件包,可以在此处找到在 python 中计算集合分区的其他方法:在 Python 中设置分区