Нарезка глома?
Вкратце: как я могу разрезать 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)])