Нарезка глома?

Вкратце: как я могу разрезать glom? То есть, имея возможность указать, что я хочу извлечь из нескольких индексов (например,y = x[(2, 5, 11)]), а не только один (например, y = x[2]).

Простой пример: скажем, у меня есть эти данные:

d = {'_result': [[1, 'a'], [2, 'b'], [3, 'c']]}

Чтобы извлечь именованный zip(*) из списка списков "_result", я мог бы сделать следующее:

from glom import Spec
extract = Spec(('_result', 
                  lambda x: list(zip(*x)), 
                  lambda x: {'x': x[0], 'y': x[1]})).glom

И я получу то, что хочу:

>>> extract(d)
{'x': (1, 2, 3), 'y': ('a', 'b', 'c')}

Но я бы хотел сделать что-то вроде...

extract = Spec(('_result', {'x': '*.0', 'y': '*.1'})).glom

или

extract = Spec(('_result', {'x': '[:].0', 'y': '[:].1'})).glom

Еще более продвинутое желание...

Я мог представить себе такой синтаксический сахар, как возможность указывать такие пути, как

"a.[2:3, -5:].{'foo', 'bar'}.name"

может пригодиться. Даже (и, возможно, безопаснее), если бы это было явным определением glom.Path, например

from glom import Path
path = Path('a', 
            ((slice(2, 3, None), slice(-5, None, None)),), 
            {'foo', 'bar'},
            'name')

Где на моем (вероятно, не лучшем выборе) мини-языке {'foo', 'bar'} означает, что мы извлекаем значения для обоих этих ключей.

1 ответ

Решение
>>> d = [[1, 'a'], [2, 'b'], [3, 'c']]
>>> glom(d, {'x': [T[0]], 'y': [T[1]]})
{'x': [1, 2, 3], 'y': ['a', 'b', 'c']}

соавтор glom здесь:-)

T вас прикрыл. Строки анализируются и преобразуются в экземпляры Path. Пути удобные, Т точные.

Если вы хотите смешать их вместе, вы можете либо объединить их в кортеж, либо использовать явный конструктор Path.

>>> Path('a.b', T[1:3])
Path('a.b', T[slice(1, 3, None)])
Другие вопросы по тегам