这部分程序是做什么的(在Nubela's guthub上找到)?
def product(*args, **kwds):
"""
for py2.6< support (they lack itertools lib)
- http://docs.python.org/2/library/itertools.html#itertools.permutations
"""
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]
for prod in result:
yield tuple(prod)
后来在节目中:
list(set((product(*[range(2) for _ in range(length)]))))
答案 0 :(得分:1)
它实现itertools.product
以实现向后兼容性。请参阅product
的文档:
itertools.product(* iterables [,repeat])
输入迭代的笛卡尔积。
等效于生成器表达式中的嵌套for循环。例如,对于y in,乘积(A,B)返回与A中的((x,y)相同的返回值 B)。
嵌套循环像里程表一样循环,最右边的元素在每次迭代时前进。这种模式创造了一个词典 排序,以便输入的iterables排序,产品 元组按排序顺序发出。
要计算iterable与其自身的乘积,请使用可选的repeat关键字参数指定重复次数。对于 例如,产品(A,repeat = 4)表示与产品(A,A,A,A)相同。
此函数等效于以下代码,但实际实现不会构建中间结果 存储器:
def product(*args, **kwds): # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 pools = map(tuple, args) * kwds.get('repeat', 1) result = [[]] for pool in pools: result = [x+[y] for x in result for y in pool] for prod in result: yield tuple(prod)
请注意文档中的代码与您找到的代码相匹配。
我不明白为什么他们在文档中提到itertools.permutations
的引用...
代码:
list(set((product(*[range(2) for _ in range(length)]))))
AFAIK相当于:
list(product(*[range(2) for _ in range(length)]))
这只是计算length
range(2)
iterables的产品。