Группировка#

chunked#

Разбивает итерируемый объект на списки указанной длины:

more_itertools.chunked(iterable, n)

Пример:

In [6]: list(more_itertools.chunked(data, 2))
Out[6]: [[1, 2], [3, 4], [5, 6], [7]]

In [7]: list(more_itertools.chunked(data, 3))
Out[7]: [[1, 2, 3], [4, 5, 6], [7]]

divide#

Разбивает итерируемый объект на n частей:

more_itertools.divide(n, iterable)

Пример:

In [25]: data
Out[25]: [1, 2, 3, 4, 5, 6, 7]

In [26]: g1, g2, g3 = more_itertools.divide(3, data)

In [27]: list(g1)
Out[27]: [1, 2, 3]

In [28]: list(g2)
Out[28]: [4, 5]

In [29]: list(g3)
Out[29]: [6, 7]

split_at#

Генерирует списки элементов из итерируемого объекта, где каждый список разделен тем значением, для которого pred возвращает True (разедлитель не включен).

more_itertools.split_at(iterable, pred)

Пример:

import time

def file_gen(filename):
    with open(filename) as f:
        for idx, line in enumerate(f):
            print(idx)
            yield line

f = file_gen('sh_cdp_neighbors_detail.txt')
for items in more_itertools.split_at(f, lambda x: '------' in x):
    print(items)
    time.sleep(2)

unzip#

Выполняет операцию противоположную zip:

more_itertools.unzip(iterable)

Пример:

In [2]: data = [('status', '*'),
   ...:         ('network', '1.23.78.0'),
   ...:         ('netmask', '24'),
   ...:         ('nexthop', '200.219.145.45'),
   ...:         ('metric', 'NA'),
   ...:         ('locprf', 'NA'),
   ...:         ('weight', '0'),
   ...:         ('path', '28135 18881 3549 6453 4755 45528'),
   ...:         ('origin', 'i')]

In [3]: headers, values = more_itertools.unzip(data)

In [4]: list(headers)
Out[4]:
['status',
 'network',
 'netmask',
 'nexthop',
 'metric',
 'locprf',
 'weight',
 'path',
 'origin']

In [5]: list(values)
Out[5]:
['*',
 '1.23.78.0',
 '24',
 '200.219.145.45',
 'NA',
 'NA',
 '0',
 '28135 18881 3549 6453 4755 45528',
 'i']

grouper#

more_itertools.grouper(iterable, n, fillvalue=None)

Пример:

In [6]: data = [1, 2, 3, 4, 5, 6, 7]

In [8]: list(more_itertools.grouper(data, 3, 0))
Out[8]: [(1, 2, 3), (4, 5, 6), (7, 0, 0)]

partition#

more_itertools.partition(pred, iterable)

Пример:

In [10]: data = [1, 2, 'a', 'b', 5, 'c', 7]

In [15]: is_false, is_true = more_itertools.partition(lambda x: str(x).isdigit(), data)

In [16]: list(is_false)
Out[16]: ['a', 'b', 'c']

In [17]: list(is_true)
Out[17]: [1, 2, 5, 7]