Как использовать itertools.groupby()?

itertools.groupby - инструмент для группировки pythonic элементов.

Из the docs мы узнаем, что python-interpreter он может делать:

# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B

# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

groupby объекты python-shell формируют пары ключ-группа, где pythonista группа является генератором.

Особенности

  • А. Группируйте последовательные элементы вместе
  • Б. Сгруппировать все вхождения элемента по отсортированному итеративному элементу
  • К. Укажите, как группировать элементы с помощью ключевой функции *

Сравнения

# Define a printer for comparing outputs
>>> def print_groupby(iterable, keyfunc=None):
...    for k, g in it.groupby(iterable, keyfunc):
...        print("key: '{}'--> group: {}".format(k, list(g)))
# Feature A: group consecutive occurrences
>>> print_groupby("BCAACACAADBBB")
key: 'B'--> group: ['B']
key: 'C'--> group: ['C']
key: 'A'--> group: ['A', 'A']
key: 'C'--> group: ['C']
key: 'A'--> group: ['A']
key: 'C'--> group: ['C']
key: 'A'--> group: ['A', 'A']
key: 'D'--> group: ['D']
key: 'B'--> group: ['B', 'B', 'B']

# Feature B: group all occurrences
>>> print_groupby(sorted("BCAACACAADBBB"))
key: 'A'--> group: ['A', 'A', 'A', 'A', 'A']
key: 'B'--> group: ['B', 'B', 'B', 'B']
key: 'C'--> group: ['C', 'C', 'C']
key: 'D'--> group: ['D']

# Feature C: group by a key function
>>> # islower = lambda s: s.islower()                      # equivalent
>>> def islower(s):
...     """Return True if a string is lowercase, else False."""   
...     return s.islower()
>>> print_groupby(sorted("bCAaCacAADBbB"), keyfunc=islower)
key: 'False'--> group: ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'D']
key: 'True'--> group: ['a', 'a', 'b', 'b', 'c']

Использует

Примечание. Некоторые из последних примеров взяты из PyCon (talk) (Spanish) Виктора Террона, «Кунг-фу на рассвете с Itertools». См. Также groupby source code, написанный на C.

* Функция, в которой все элементы передаются и сравниваются, влияя на результат. Другие объекты с ключевыми функциями включают sorted(), max() и min().


Ответ

# OP: Yes, you can use `groupby`, e.g. 
[do_something(list(g)) for _, g in groupby(lxml_elements, criteria_func)]

python

itertools

2022-11-16T19:41:42+00:00