【问题标题】:create list with negative value permutation创建具有负值排列的列表
【发布时间】:2016-01-27 15:32:48
【问题描述】:

谁能帮助从给定列表中创建具有负值的列表?

例如:

values = [1, 2, 3]

期望的输出是

[[-1, 2, 3], [1, -2, 3], [1, 2, -3],[-1, -2, 3], [1, -2, -3], [-1, 2, -3], [-1, -2, -3]]

【问题讨论】:

  • 为什么[1, 2, 3] 不是一个有效的输出?

标签: python list permutation


【解决方案1】:

产生 3 次 [1, -1] 的乘积并将结果与​​您的输入列表相乘:

from itertools import product

values = [1, 2, 3]
[[num * mul for num, mul in zip(values, combo)]
 for combo in product([1, -1], repeat=len(values))]

演示:

>>> from itertools import product
>>> values = [1, 2, 3]
>>> [[num * mul for num, mul in zip(values, combo)] for combo in product([1, -1], repeat=len(values))]
[[1, 2, 3], [1, 2, -3], [1, -2, 3], [1, -2, -3], [-1, 2, 3], [-1, 2, -3], [-1, -2, 3], [-1, -2, -3]]

输出顺序与您指定的略有不同,但生成的值相同,加上原始列表作为第一个元素。

【讨论】:

    【解决方案2】:

    另一种方法是喜欢这个而不是有两个列表推导

    from itertools import *
    
    print [[1*x[0], 2*x[1], 3*x[2]] for x in list(product([1,-1], repeat=3))]
    [[1, 2, 3], [1, 2, -3], [1, -2, 3], [1, -2, -3], [-1, 2, 3], [-1, 2, -3], [-1, -2, 3], [-1, -2, -3]]
    

    由于您知道列表索引处的值,您可以将它们乘以 x 中的相应索引。然而,这不像使用两个列表推导式那样灵活,比如@Martijn's answer,它可以更容易地处理可变大小的列表。

    【讨论】:

    • 但这并不真正适用于任意输入值列表。假设您现在想对[42, 81] 做同样的事情。然后用[1, 2, 4, 8]
    • @MartijnPieters 是的,我说的是对的。我认为假设这些值不是任意的,这更容易阅读。你的答案更可靠
    猜你喜欢
    • 2018-07-28
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2014-01-17
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多