gpt4 book ai didi

python - 发电机自身的产物

转载 作者:行者123 更新时间:2023-11-28 21:40:52 25 4
gpt4 key购买 nike

我需要迭代生成器与自身的乘积,不包括对角线。我正在尝试使用 itertools.tee 两次使用同一生成器

def pairs_exclude_diagonal(it):
i1, i2 = itertools.tee(it, 2)
for x in i1:
for y in i2:
if x != y:
yield (x, y)

这行不通

In [1]: for (x, y) in pairs_exclude_diagonal(range(3)):
...: print(x, y)
0 1
0 2

documentation for tee状态:

Return n independent iterators from a single iterable.

执行此操作的正确方法是什么?

(我用的是python3.6.1)

最佳答案

看起来你想使用 itertools.permutations .

In [1]: import itertools

In [2]: for x, y in itertools.permutations(range(3), 2):
...: print(x, y)
...:
0 1
0 2
1 0
1 2
2 0
2 1

如果你真的想用tee来做,你必须把第二个iterable变成一个list,这样它就不会第二次通过外部 for 循环耗尽:

In [14]: def pairs_exclude_diagonal(it):
...: i1, i2 = itertools.tee(it, 2)
...: l2 = list(i2)
...: for x in i1:
...: for y in l2:
...: if x != y:
...: yield (x, y)
...:

In [15]: for (x, y) in pairs_exclude_diagonal(range(3)):
...: print(x, y)
...:
0 1
0 2
1 0
1 2
2 0
2 1

请注意,这是毫无意义的,因为在迭代器上调用 list 会将其加载到内存中,并且首先破坏了拥有迭代器的目的。

关于python - 发电机自身的产物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45205335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com