如何连接(Python' s)iter_tools.product()的所有响应?

时间:2018-04-02 20:29:28

标签: python python-2.7 generator list-comprehension itertools

我尝试使用Python 2.7生成多个长度的所有可能字符组合的列表。为了举例,我使用了一个更小的子集来证明这个概念。

下面我生成A-C中长度为1和2的所有字母组合。然后尝试使用同一生成器理解中的第二个for循环生成一个列表(错误的术语?)。我可以将单个长度的所有字符串放入列表中,但在尝试

时出现错误an integer is required

如何连接产品生成器函数中repeat的每个级别的所有响应?

>>> l
['A', 'B', 'C']
>>> p1 = (''.join(p) for p in product(l, repeat=1))
>>> p2 = (''.join(p) for p in product(l, repeat=2))
>>> [str(i) for i in p1]
['A', 'B', 'C']
>>> [str(i) for i in p2]
['AA', 'AB', 'AC', 'BA', 'BB', 'BC', 'CA', 'CB', 'CC']
>>> pn = (''.join(p) for p in product(l, repeat=i) for i in range(1,3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: an integer is required

是的,我可以使用嵌套for循环执行此操作。我尝试用单行代码来做这件事,因为我看到了类似于生成器理解的例子。我之前使用过列表推导 - 但是当我提供嵌套列表推导时,我会得到整个组合列表的长串列表。

也可能是因为我无法正确理解迭代器函数,因为我在代码示例中的第5行和第7行上努力使这些调试列表理解正确。

1 个答案:

答案 0 :(得分:3)

你让你在你的生成器表达式中以错误的方式循环,它们从左到右“嵌套”:

$ awk 'NR==FNR{a[$1]=$2; next} {print $1, a[$1]}' file1 file2


title1 linkabc
anothertitle2
title3 linkfgh
anothertitle4
title5 linklsfr
anothertitle6
title7 linksdrlk
anothertitle8
title9 linkghftht