Путь простоты кода, меньше значит больше.

Известно, что Python очень хорошо манипулирует данными и очищает их. Сегодня я представлю библиотеку Pipe для обработки данных.

Установить

pip install pipe

Элемент фильтра

Подобно filter, оператор where in pipe может фильтровать элементы в итерируемом объекте.

In [4]: from pipe import *
In [5]: numbers = [0, 1, 2, 3, 4, 5, 6 ,7 ,8]

In [6]: list(numbers | where(lambda x: x % 2 == 0))
Out[6]: [0, 2, 4, 6, 8]

Элемент действия

Подобно map, select операция применяет функцию к каждому элементу в итерируемом объекте. В следующем примере мы удвоим элементы в списке.

In [8]: list(numbers | select(lambda x: x * 2))
Out[8]: [0, 2, 4, 6, 8, 10, 12, 14, 16]

Конечно, несколько операций также можно комбинировать.

В следующем примере нужно выбрать четные числа в списке и увеличить их в 2 раза. В отличие от filter и map, pipe можно связать несколько операций, точно так же, как водопровод — это водопровод.

In [10]: list(numbers
    ...:     | where(lambda x: x % 2 == 0)
    ...:     | select(lambda x: x * 2)
    ...:    )
    ...:
Out[10]: [0, 4, 8, 12, 16]

Соединительные элементы

Очень неудобно работать с вложенными списками. К счастью, pipe предлагает дружественный интерфейс, just chain it.

In [17]: list([[1, 2], [3, 4], [5,6]] | chain)
Out[17]: [1, 2, 3, 4, 5, 6]
In [18]: list((1, 2, 3) | chain_with([4, 5], [6,7]))
Out[18]: [1, 2, 3, 4, 5, 6, 7]
In [19]: list((1, 2, 3) | chain_with([4, 5], [6,[7],8]))
Out[19]: [1, 2, 3, 4, 5, 6, [7], 8]

Как вы можете видеть выше, chain можно разобрать только на один уровень, если мы хотим разобрать несколько слоев вложенности, мы используем метод traverse.

In [20]: list([[1, 2], [[[3], [[4]]], [5]]] | traverse)
Out[20]: [1, 2, 3, 4, 5]

В сочетании с методом select получите набор атрибутов поля в словаре.

In [22]: fruits = [
    ...:     ...:     {"name": "apple", "price": [2, 5]},
    ...:     ...:     {"name": "orange", "price": 4},
    ...:     ...:     {"name": "grape", "price": 5},
    ...:     ...: ]
In [23]: list(fruits
    ...:     ...:      | select(lambda fruit: fruit["price"])
    ...:     ...:      | traverse)
    ...:     ...:
Out[23]: [2, 5, 4, 5]

Группировка

Группировка элементов в списке очень важна, и это можно сделать с помощью groupby в pipe..

In [25]: list(numbers
    ...:     ...:      | groupby(lambda x: 'Even' if x % 2 == 0 else 'Odd')
    ...:     ...:      | select(lambda x: {x[0]: list(x[1])})
    ...:     ...:     )
    ...:     ...:
Out[25]: [{'Even': [0, 2, 4, 6, 8]}, {'Odd': [1, 3, 5, 7]}]

Точно так же вы можете добавить where условия фильтрации для выбора.

In [26]: list(numbers
    ...:     ...:      | groupby(lambda x: 'Even' if x % 2 == 0 else 'Odd')
    ...:     ...:      | select(lambda x: {x[0]: list(x[1] | where(lambda x: x > 2))})
    ...:     ...:     )
    ...:     ...:
Out[26]: [{'Even': [4, 6, 8]}, {'Odd': [3, 5, 7]}]

Перестановка строк и столбцов

Строки и столбцы часто используются для преобразования между строками и столбцами при обработке данных, особенно при использовании DataFrame, который использует pipe одной строки кода для преобразования строки и столбца.

In [27]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] | transpose
Out[27]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

Удалить элементы

Дедупликация списков также является распространенной операцией, и dedup используется в pipe для дедупликации списков.

In [28]: list([1, 1, 2, 2, 3, 3, 1, 2, 3] | dedup)
Out[28]: [1, 2, 3]

В отличие от dedup, uniq будет сохранять только один непрерывный повторяющийся элемент, а непоследовательные повторяющиеся элементы не будут фильтроваться.

In [29]: list([1, 1, 2, 2, 3, 3, 1, 2, 3] | uniq)
Out[29]: [1, 2, 3, 1, 2, 3]

Сегодня мы представили хороший способ обработки данных. Использование pipe library может упростить утомительные операции и улучшить читаемость кода.

Использованная литература:

https://pypi.org/project/pipe/

Спасибо, что прочитали!

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Посетите наш Community Discord и присоединитесь к нашему Коллективу талантов.