繁体   English   中英

Python中迭代器上的列表理解元组

[英]List Comprehension tuple over iterator in Python

我正在学习Python的itertools模块中的迭代器和groupby函数。 我了解以下代码采用整数字符串并输出元组(x,y),其中x是y重复的次数。

from itertools import groupby
s = input()
print(*[(len(list(c)), int(k)) for k, c in groupby(s)])

我不明白的是“ groupby(s)中的k,c”是列表理解的一部分。 如果“ groupby(s)”是一个元组列表,但它是一个迭代器,这对我来说很有意义。

我的问题是列表推导如何通过迭代器的两个变量生成一个列表?

我的测试表明,我可以在迭代器上使用一个变量来生成列表。 该列表有何不同?

groupby(s)的结果不是迭代器,而是键和迭代器的元组。 传递两个变量,“ k,c”将k分配给groupby中的键,将c分配给groupby中的迭代器。

有歧义,因为

for k,c in groupby(s)

是相同的

for (k,c) in groupby(s)

其中k和c分配给元组中的值,并且

for k in groupby(s)

将k分配给元组本身。

同样,在示例代码中,list(c)使用迭代器c创建列表。

区别在于groupby将返回一系列对(长度为2的元组)。 您可以将每个绑定到一对变量。

作为一般概念,这就像将groupby解析为相同对的列表一样。 实际的列表理解可以在右边使用任何可迭代的; 它不限于静态序列(列表,元组,字符串)。

让我们看一个更好的例子。 groupby收集具有相同值的相邻元素。 它使用迭代器为每个连续的值组执行此操作。 下面的示例字符串具有B,C,D和Z的连续字符串,以及单个A的两个单独的字符串。groupby将为每个起始位置实例化一个迭代器。 调用时,迭代器将返回一系列连续的字母,如输出所示。

from itertools import groupby
s = "BBCCCDDDDAZZA"
for k, c in groupby(s):
    print k, list(c)

输出:

B ['B', 'B']
C ['C', 'C', 'C']
D ['D', 'D', 'D', 'D']
A ['A']
Z ['Z', 'Z']
A ['A']

正如您已经指出的,如果只打印迭代器c ,那么我们得到的只是对象句柄。 要获取字母,我们需要调用迭代器。

在您发布的代码中,

for k, c in groupby(s)

groupby接收一系列(字母,迭代器)对。 list函数是调用迭代器的功能,它获取字母列表。

这是否可以澄清一切?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM