Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 19, 2018 17:04:02

driveman
Зарегистрирован: 2018-02-28
Сообщения: 20
Репутация: +  1  -
Профиль   Отправить e-mail  

Тонкости groupby()

В книге Бизли “Python. Подробный справочник” на странице 343 сказано:

groupby(iterable )
Создает итератор, который группирует одинаковые элементы из итерируемого объекта iterable, следующие друг за другом. Процесс группировки основан на поиске одинаковых элементов. Например, если итерируемый объект iterable возвращает один и тот же элемент несколько раз подряд, этот элемент образует группу. Если функция применяется к отсортированному списку, она образует группы по числу уникальных элементов в списке.
Из этой цитаты складывается впечатление, что в принципе может иметь смысл применение groupby к неотсортированной последовательности. Но никак не могу представить случай, когда это будет нужно. Ведь весь смысл группировки в том, чтобы сгруппировать элементы с одинаковыми значениями, а в данном случае это можно сделать только если они отсортированы.

Это Бизли так неудачно выразился или огрехи перевода, или все же может возникнуть необходимость применить groupby к неотсортированным последовательностям?

Отредактировано driveman (Апрель 19, 2018 19:53:18)

Офлайн

#2 Апрель 19, 2018 18:14:47

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Тонкости groupby()

Зачем гадать когда можно посмотреть?

Make an iterator that returns consecutive keys and groups from the iterable. The key is a function computing a key value for each element. If not specified or is None, key defaults to an identity function and returns the element unchanged. Generally, the iterable needs to already be sorted on the same key function.
А на вопрос зачем это надо то ответ вполне очевиден:
 In [3]: [(x, list(y)) for (x, y) in (groupby('aaabbc'))]
Out[3]: [('a', ['a', 'a', 'a']), ('b', ['b', 'b']), ('c', ['c'])]
In [4]: [(x, list(y)) for (x, y) in (groupby('abaabbc'))]
Out[4]:
[('a', ['a']),
 ('b', ['b']),
 ('a', ['a', 'a']),
 ('b', ['b', 'b']),
 ('c', ['c'])]
Это решает разные задачи.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Апрель 19, 2018 19:10:05

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Тонкости groupby()

driveman
Но никак не могу представить случай, когда это будет нужно. Ведь весь смысл группировки в том, чтобы сгруппировать элементы с одинаковыми значениям
удалить повторы в строке, например
 >>> from itertools import groupby
>>> s = 'qwerrrrtyq'
>>> ''.join([k for k,v in groupby(s)])
'qwertyq'
>>> 

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version