为什么从itertools.permutation读取/拆包数据会更改其属性/内容



我正在尝试使用itertools中的排列功能,然后我注意到了。如果我试图从排列中解压缩/读取数据,它会更改一些属性信息

from itertools import permutations
a = permutations('abc')

print(('a', 'b', 'c') in a)
for x in a:
print(x)
print(('a', 'b', 'c') in a)
for x in a:
print(x)

输出:

True
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
False

这是怎么发生的?我查看了官方网页,找不到任何线索。我的环境是pycharm与python 3.7.4

正如其他人所说,问题在于a不是一个列表,而是一个生成器;也就是说,一个序列在迭代时会被用完——因此只能迭代一次。

如果你仔细观察,你会发现你的第一个打印循环只打印了六个排列中的五个;当您在第一个CCD_ 3语句中将第一个排列与CCD_。然后,for-循环打印出剩余的内容,而代码的其余部分则试图从空杯子里喝水。

要获得您期望的行为,请将a放入如下列表中:

a = list(permutations('abc'))

当你有机会的时候,阅读生成器、迭代器和";理解;;它们在Python中无处不在(通常隐藏在众目睽睽之下(,而且非常棒。

从生成器中移除,并将输出转换为列表,因为比较已经使用,所以正在消失。itertools.permutation只是一个迭代器,当您使用一个值进行比较时,它会转移到下一个。

代码:

from itertools import permutations
a = list(permutations('abc'))

print(('a', 'b', 'c') in a)
for x in a:
print(x)
print(('a', 'b', 'c') in a)
for x in a:
print(x)

输出:

True
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
True
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

最新更新