python-无需重复就为笛卡尔乘积生成器
作者:互联网
我有一个生成器,我想对它执行一个嵌套循环,以使内部循环将从当前外部循环所在的位置开始.
例如,我有一个生成列表[1,2,3]的生成器,我的循环应生成:(1,2),(1,3),(2,3).
我想出的代码如下:
from itertools import tee
def my_gen():
my_list = [1, 2, 3]
for x in my_list:
yield x
first_it = my_gen()
while True:
try:
a = next(first_it)
first_it, second_it = tee(first_it)
for b in second_it:
print(a,b)
except StopIteration:
break
这段代码很麻烦,效率不高,在我看来也不是很Python.请注意,由于我需要一个内部循环来处理来自外部循环的特定值,因此无法使用combinations_with_replacement.
对于更优雅和Pythonic代码有什么建议吗?
解决方法:
仅对所得迭代器之一进行重复克隆和用尽不是非常有效.按照itertools.tee
docs:
In general, if one iterator uses most or all of the data before another iterator starts, it is faster to use list() instead of tee().
from itertools import islice
my_list = [1, 2, 3]
# or, more generally
# my_list = list(my_gen())
for i, a in enumerate(my_list):
for b in islice(my_list, i+1, None):
print((a, b))
(1, 2)
(1, 3)
(2, 3)
标签:cartesian-product,python 来源: https://codeday.me/bug/20191110/2014043.html