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 ...