在Python中使用迭代器列出理解元组

时间:2017-10-19 19:52:10

标签: python iterator list-comprehension

我正在学习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)”是一个元组列表但它是一个迭代器,那对我来说是有意义的。

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

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

2 个答案:

答案 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创建列表。