我正在学习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)])
我不理解的是“k,c in groupby(s)”作为列表理解的一部分。如果“groupby(s)”是一个元组列表但它是一个迭代器,那对我来说是有意义的。
我的问题是列表解析如何通过迭代器从两个变量生成一个列表?
我的测试表明,我可以在迭代器上使用一个变量来生成列表。该清单有何不同?
答案 0 :(得分:0)
区别在于 groupby(s)将返回一系列对(长度为2的元组)。您可以将每个变量绑定到一对变量。
作为一般概念,这就像 groupby(s)解析为相同对的列表一样。实际的列表理解可以在右端使用任何迭代;它不限于静态序列(list,tuple,string)。
示例强>
让我们看一个更好的例子。 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 函数调用迭代器,获取字母列表。
这是否澄清了事情?
答案 1 :(得分:0)
groupby(s)的结果不是迭代器,而是键和迭代器的元组。传递两个变量," k,c"将k分配给groupby(s)中的键,将c分配给groupby(s)中的迭代器。
有歧义因为
for k,c in groupby(s)
与
相同for (k,c) in groupby(s)
其中k和c分配给元组中的值,
for k in groupby(s)
将k分配给元组本身。
此外,在示例代码列表(c)中使用迭代器c创建列表。