编程语言
首页 > 编程语言> > python-无需重复就为笛卡尔乘积生成器

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