列表中所有可能的求和

问题描述 投票:0回答:1

我有一个自定义类 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 类型不可迭代”之类的错误,或者我的输出只有一个元素(原始元素)。

python list combinations
1个回答
1
投票

如果您安装

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 中设置分区

© www.soinside.com 2019 - 2024. All rights reserved.