Путь простоты кода, меньше значит больше.
Известно, что 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 и присоединитесь к нашему Коллективу талантов.