Python 获取列表的所有加减组合

Python 获取列表的所有加减组合,python,permutation,itertools,Python,Permutation,Itertools,我试图找到一系列数字的所有加减组合。我想创建一个递归函数来实现这一点,但我在概念化如何工作方面遇到了困难。这是我现在的代码 from itertools import permutations values = [1, 2] perm = [] size = 1 while size <= len(values): perm += permutations(values, size) size = size + 1 for i in perm: someFunt

我试图找到一系列数字的所有加减组合。我想创建一个递归函数来实现这一点,但我在概念化如何工作方面遇到了困难。这是我现在的代码

from itertools import permutations
values = [1, 2]
perm = []

size = 1
while size <= len(values):
    perm += permutations(values, size)
    size = size + 1

for i in perm:
    someFuntion(i)
有人能帮我概念化如何写“someFunction”吗

编辑:所以我更新了我的函数,它适用于大小为2的列表,但是我在处理较大的列表时遇到了问题。您能解释一下如何在不将列表传递给函数的情况下返回列表吗

def some_function(i, results):

    # Base case
    if len(i) == 0:
        return 
    # Base case
    elif len(i) == 1:

        if i[0] not in results:
            results.append(i[0])

        return i[0]

    else:

        topVal = str(i.pop(0))

        plus = topVal + " + " + str(some_function(i, results))
        minus = topVal + " - " + str(some_function(i, results))
        results.append(plus)
        results.append(minus)


results = []
possibilities = list(flatten(map(lambda s: list(permutations(s)), powerset(values))))

for p in possibilities:
    some_function(list(p), results)

print(results)
这是我的列表输出=[1,2,3]

['1', '2', '3', '1 + 2', '1 - 2', '2 + 1', '2 - 1', '1 + 3', '1 - 3', '3 + 1', '3 - 1', '2 + 3', '2 - 3', '3 + 2', '3 - 2', '2 + 3', '2 - 3', '1 + None', '1 - 3', '3 + 2', '3 - 2', '1 + None', '1 - 2', '1 + 3', '1 - 3', '2 + None', '2 - 3', '3 + 1', '3 - 1', '2 + None', '2 - 1', '1 + 2', '1 - 2', '3 + None', '3 - 2', '2 + 1', '2 - 1', '3 + None', '3 - 1']

编辑2:我根据你的第二次编辑算出了。谢谢你花时间陪我走过这段路。我认为这将有助于我将来更好地编写递归函数。

因此,您希望定义一个函数
一些函数

from itertools import chain, permutations
from more_itertools import powerset, flatten

values = [1, 2]
signs = ["+", "-"]
possibilities = list(flatten(map(lambda s: list(permutations(s)), powerset(values))))

list(flatten([some_function(p) for p in possibilities]))
输出

['', '1', '2', '1 + 2', '1 - 2', '2 + 1', '2 - 1']
我已经成功地在8行中递归地定义了这个函数。其轮廓如下所示。请注意,您可能会将前两个基合并为一个基

def some_function(i):
    if <base case>:
        # Base case
    elif <second base case>:
        # Base case
    else:
        # Recursive case
编辑2:

让我们先清理一下。试着熟悉列表索引;你可能会经常使用它
i[0]
表示获取列表的标题
i[1::
表示获取其他所有内容(尾部)。也尽可能不要考虑变异;你只会让问题变得更难。您可以使用append在本地构建列表,但不要将列表传入另一个函数(包括递归)并希望正确地对其进行修改。这是我清理的结果。你快到了

def some_function(i):
    if len(i) == 0:
        return [""]
    elif len(i) == 1:
        return [str(i[0])]
    else:
        head = str(i[0])
        results = some_function(i[1:])
        # ...
        for result in results:
            plus = head + " + " + result
            minus = head + " - " + result
            # ...
        return ...

首先处理一个简单的元组,如
(1,2)
。尝试将
结果
视为基本情况的返回(例如,
[“2”]
),并查看是否可以“构建”下一个情况(例如,
[“1+2”,“1-2”]
)。

res=[”(“+(f”{s}”)。将(str(c)用于梳状结构中的c)+“””用于符号中的梳状排列(值)
^不包括子集。@请查看我基于“编辑”的“编辑2”。您的函数是否传递了除元组外的其他值?实际上只传递了元组。正如您从我的第一个代码片段中看到的,您可能需要进行一点“后处理”以获得最终的字符串列表输出。我尝试了一种解决方案,即根据传入的元组大小确定基本大小,然后在递归情况下修改元组,但这不起作用。另外,如果只将元组传递给函数,我不确定如何合并符号数组。你介意再给我一个提示吗?你说得对!事实上,我的前两个基本情况是当
len(i)=0
len(i)==1
时。此外,如果您仍然被卡住,请随意编辑您的问题以显示您的进度。
['',
 '1',
 '2',
 '3',
 '1 + 2',
 '1 - 2',
 '2 + 1',
 '2 - 1',
 '1 + 3',
 '1 - 3',
 '3 + 1',
 '3 - 1',
 '2 + 3',
 '2 - 3',
 '3 + 2',
 '3 - 2',
 '1 + 2 + 3',
 '1 + 2 - 3',
 '1 - 2 + 3',
 '1 - 2 - 3',
 '1 + 3 + 2',
 '1 + 3 - 2',
 '1 - 3 + 2',
 '1 - 3 - 2',
 '2 + 1 + 3',
 '2 + 1 - 3',
 '2 - 1 + 3',
 '2 - 1 - 3',
 '2 + 3 + 1',
 '2 + 3 - 1',
 '2 - 3 + 1',
 '2 - 3 - 1',
 '3 + 1 + 2',
 '3 + 1 - 2',
 '3 - 1 + 2',
 '3 - 1 - 2',
 '3 + 2 + 1',
 '3 + 2 - 1',
 '3 - 2 + 1',
 '3 - 2 - 1']
def some_function(i):
    if len(i) == 0:
        return [""]
    elif len(i) == 1:
        return [str(i[0])]
    else:
        head = str(i[0])
        results = some_function(i[1:])
        # ...
        for result in results:
            plus = head + " + " + result
            minus = head + " - " + result
            # ...
        return ...