На использование группового - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь понять, как работает 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.

Может кто-то просветить меня?

Спасибо, Готье

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Хорошо, если вы точно придерживаетесь этих командных строк:

 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 может печатать только один раз. Это то, что я бы понял.

0 голосов
/ 07 мая 2019

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)
>>>
...