关于groupby的利用

时间:2019-05-07 11:45:57

标签: python-3.x itertools

我正在尝试了解groupby的工作方式。实际上,我尝试解决黑客等级问题(“压缩字符串!”)

当我看讨论时,会以书面形式给出答案

from itertools import groupby

print(*[(len(list(c)), int(k)) for k, c in groupby(input())])

,并且有效。据我了解,代码将输入转换为迭代器,因此他遇到并打印了他想要的东西。

但是当我将其转换为

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

它什么也不打印。我认为这很奇怪,但这主要是由于对自己的了解不足。而且我不太了解python库的解释。

有人可以启发我吗?

谢谢, 高铁(Gautier)

2 个答案:

答案 0 :(得分:0)

enter image description here 我想知道您如何运行代码?当我在python3.6中运行代码时,代码就可以了

Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from itertools import groupby
>>> print(*[(len(list(c)), int(k)) for k, c in groupby(input())])
111111232768723648
(6, 1) (1, 2) (1, 3) (1, 2) (1, 7) (1, 6) (1, 8) (1, 7) (1, 2) (1, 3) (1, 6) (1, 4) (1, 8)
>>> from itertools import groupby
>>> iter = groupby(input())
1123512433241231
>>> print(*[(len(list(c)), int(k)) for k, c in iter])
(2, 1) (1, 2) (1, 3) (1, 5) (1, 1) (1, 2) (1, 4) (2, 3) (1, 2) (1, 4) (1, 1) (1, 2) (1, 3) (1, 1)
>>>

答案 1 :(得分:0)

好吧,如果您严格遵循以下命令行:

 indice = groupby(input())

 112222334411122111

 print(*[(len(list(c)), int(k)) for k, c in indice])

它将回答您:

(2, 1) (4, 2) (2, 3) (2, 4) (3, 1) (2, 2) (3, 1)

但是,如果您完全按照以下命令行操作:(紧接答案)

  for k in indice :
          print(k)

这不会返回任何内容(可能是天真的代码),但是有趣的是,如果您重写代码:

  print(*[(len(list(c)), int(k)) for k, c in indice])

它将不返回任何内容

其他有趣的事情:写作

  print(*[(len(list(c)), int(k)) for k, c in indice])

两次(重置后)将第二次不返回任何内容(但将第一次返回您想要的内容)。就像groupby函数只能打印一次。这是我会理解的东西。