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

时间:2019-12-12 03:36:19

标签: 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:
    someFuntion(i)

我希望给定列表的输出是这个。

(1)
(2)
(1 + 2)
(1 - 2)
(2 + 1)
(2 - 1)

有人可以帮我概念化如何编写“ 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:我根据您的第二次编辑得出了答案。感谢您抽出宝贵的时间来指导我。我认为这将有助于我将来更好地编写递归函数。

1 个答案:

答案 0 :(得分:1)

因此,您要定义一个函数@import “node_modules/normalize.scss/normalize.scss”这样

some_function

输出

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]))

我设法在8行中递归定义了函数。其轮廓如下所示。请注意,您可能可以将前两个碱基折叠为一个。

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

关键是要意识到无论遇到哪种情况,每次都需要返回一个字符串列表。对于递归情况,您要处理元组中的第一个整数,然后信任递归来处理余数。然后使用可能的符号之一将第一个整数与其余部分组合。了解如何插入字符串和使用列表推导(或展平)也可能会有帮助。

编辑:请参见下面的评论。 [1,2,3]的输出如下:

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

编辑2:

首先让我们进行清理。尝试使列表索引适应;您可能会经常使用它。 ['', '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'] 意味着成为列表的头。 i[0]意味着得到所有其他东西(尾巴)。也尽可能不要考虑变异。您只会使问题变得更加棘手。您可以使用append在本地建立列表,但不要将列表传递到另一个函数中(包括递归地),并希望正确地对其进行变异。这是我清理的结果。你快到了!

i[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 ... 。尝试将(1,2)视为基本案例(例如results)的返回值,看看是否可以从那里“构建”下一个案例(例如["2"])。