更清洁的方式在Python中进行itertools产品组合?

时间:2015-12-03 21:41:20

标签: python itertools

我有以下示例代码。我在生成的产品前面加上强制性的'1'。有没有更好的方法来使用列表生成而不使用tuple([1]) + a

from itertools import product

print [tuple([1]) + a for a in list(product([0, 1], repeat=2))]

输出结果为:

[(1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

此外,从上面的输出获得以下结果的最佳方法是什么(基本上,将元组中的每个值乘以10^i,其中i在相应的索引中并对该结果求和):< / p>

[100, 101, 110, 111]

4 个答案:

答案 0 :(得分:1)

tuple([1])仅相当于(1,),您不需要致电list

print [(1,) + a for a in product([0, 1], repeat=2)]

答案 1 :(得分:1)

def rawProducts(repeat=2):
  return product([0, 1], repeat=repeat)

def toNumber(seq):
  # here's the trick: the last parameter to reduce() is the initial value;
  # we pretend that we already have a 1 before we started iterating 
  # over seq, instead of prepending the 1 to seq.
  return reduce(lambda acc, x: 10 * acc + x, seq, 1)

result = [toNumber(prod) for prod in rawProducts()]

这对你有用吗? BTW适用于repeat参数的不同值。

答案 2 :(得分:0)

map(int,("".join(("1",)+x) for x in list(product("01", repeat=2))))

答案 3 :(得分:-1)

我首先创建一个辅助函数来处理数字连接。

def num_join(*digits):
    return int(''.join(map(str, digits)))

然后在列表推导的简化版本中使用它

print [num_join(1, *a) for a in product((0, 1), repeat=2)]

我用来将数字元组转换为数字的技术是简单地将每个数字转换为字符串,这样我就可以使用普通的字符串连接,然后将其转换回int。我还删除了多余的list,这在我们反复审核product的结果时不是必需的。