4

我正在尝试在 Python 中创建一个函数,该函数将整数列表作为输入并返回一个更大的列表,其中包含这些数字的所有正负可能性。

假装“+”是正数,“-”是负数

输出应与:

foo([-4])
>>> [ [4], [-4] ]

foo([+, +])
>>> [ [+,+], [+,-], [-,+], [-,-] ]

foo([-, +])
>>> [ [+,+], [+,-], [-,+], [-,-] ]

foo([-1, 3])
>>> [ [1,3], [1,-3], [-1,3], [-1,-3] ]

foo( [+,-,+] )
>>> [ [-,-,-],[+,-,-],[-,+,-],[-,-,+],[+,+,-],[+,-,+],[-,+,+],[+,+,+] ]
4

3 回答 3

10

对于数字,您可以itertools.product在生成包含正数和负数的列表后创建所有组合:

from itertools import product

def foo(nums):
    return list(product(*((x, -x) for x in nums)))

演示:

>>> foo([-4])
[(4,), (-4,)]
>>> foo([-1, 3])
[(1, 3), (1, -3), (-1, 3), (-1, -3)]
>>> foo([1, 3])
[(1, 3), (1, -3), (-1, 3), (-1, -3)]
>>> foo([1, -3, 4])
[(1, 3, 4), (1, 3, -4), (1, -3, 4), (1, -3, -4), (-1, 3, 4), (-1, 3, -4), (-1, -3, 4), (-1, -3, -4)]
于 2013-08-09T23:12:11.333 回答
6
list(itertools.product(*([x, -x] for x in input)))

对于输入中的每个数字,您希望以各种可能的方式选择一个数字或其负数。这是输入中每个的笛卡尔积。可以为您执行此操作,然后列出所有输出。{x[i], -x[i]}x[i]itertools.productlist

于 2013-08-09T23:12:37.647 回答
0

您可以使用itetools.product,根据输入列表的长度找到笛卡尔积,[1, -1]然后将它们与输入列表中的项目相乘。

>>> from operator import mul
>>> from itertools import product
def solve(lis):
    for prod in product([-1, 1], repeat=len(lis)):
        yield [mul(*x) for x in  zip(prod, lis)]
...         
>>> list(solve([-4]))
[[4], [-4]]
>>> list(solve([-1, 3]))
[[1, -3], [1, 3], [-1, -3], [-1, 3]]
于 2013-08-09T23:19:17.737 回答