我正在尝试在Python中创建一个函数,它将整数列表作为输入,并返回一个包含这些数字的所有正面和负面可能性的更大列表。
假装'+'是正数,' - '是负数
输出应符合:
foo([-4])
>>> [ [4], [-4] ]
foo([+, +])
>>> [ [+,+], [+,-], [-,+], [-,-] ]
foo([-, +])
>>> [ [+,+], [+,-], [-,+], [-,-] ]
foo([-1, 3])
>>> [ [1,3], [1,-3], [-1,3], [-1,-3] ]
foo( [+,-,+] )
>>> [ [-,-,-],[+,-,-],[-,+,-],[-,-,+],[+,+,-],[+,-,+],[-,+,+],[+,+,+] ]
答案 0 :(得分:9)
对于正好数字,您可以在生成包含正数和负数的列表后使用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)]
答案 1 :(得分:6)
list(itertools.product(*([x, -x] for x in input)))
您想要一切可能的方法为输入中的每个数字选择数字或其负数。对于输入中的每个{x[i], -x[i]}
,这是x[i]
Cartesian product。 itertools.product
可以为您执行此操作,然后list
列出所有输出。
答案 2 :(得分: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]]