python正数和负数列表的可能性

时间:2013-08-09 23:07:04

标签: python list

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

假装'+'是正数,' - '是负数

输出应符合:

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

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

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

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

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

3 个答案:

答案 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 productitertools.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]]