Использование Reduce с начальным значением в трубе с toolz Python - PullRequest
0 голосов
/ 09 марта 2020

Я хочу выполнить операцию сокращения как часть конвейера для сортировки элементов dict по ключу. например,

from toolz import pipe

items = [{"id":1, "val":1}, {"id":2, "val":2}, {"id":2, "val":3}]
res = pipe(items, reduce(combine_items), other_ops...)
# res = {1: [{'id': 1, 'val': 1}], 2: [{'id': 2, 'val': 2}, {'id': 2, 'val': 3}]}

def combine_items(record_list, item):
    record_list.setdefault(item.get("id"), []).append(item)
    return record_list

Мне удалось сделать это с помощью лямбды, т.е.

res = pipe(items, lambda x: reduce(combine_items, x, {}), other_ops...)

Мой вопрос заключается в том, есть ли другой способ сделать это без необходимости использовать лямбда в труба?

Основная проблема, с которой я столкнулся, заключается в том, что мне нужно значение по умолчанию, чтобы мой список добавлялся для правильной работы в редукте, и я не уверен, есть ли способ правильно заполнить его в трубе в противном случае.

1 Ответ

1 голос
/ 09 марта 2020

Вместо того, чтобы бросать свои собственные combine_items, вы можете использовать groupby() из toolz, который делает именно то, что вы пытаетесь сделать здесь:

from toolz import groupby

res = groupby('id', items)

Если вы хотите чтобы использовать это как часть канала, вы можете использовать functools.partial() для передачи groupby() ключевого аргумента:

from toolz import groupby, pipe
from functools import partial

res = pipe(items, partial(groupby, 'id'), other_ops...)
...