Python 使用glom将词典列表的字段提取到新词典中

Python 使用glom将词典列表的字段提取到新词典中,python,glom,Python,Glom,我有以下高度简化的结构 elements=[{“id”:“1”,“counts”:[1,2,3]}, {“id”:“2”,“计数”:[4,5,6]}] 我希望能够使用glom,构建一个新的{:}形式的词典,例如pos=2: {"1": 3, "2": 6} 或者一个元组列表/元组 [("1",3), ("2", 6)] 使用dict comprehension很容易,但是数据结构更复杂,我想动态地指定要提取的内容。前面的例子是我想要实现的最简单的事情 过了一会儿,我设法解决了它如下 从gl

我有以下高度简化的结构

elements=[{“id”:“1”,“counts”:[1,2,3]},
{“id”:“2”,“计数”:[4,5,6]}]
我希望能够使用
glom
,构建一个新的
{:}
形式的词典,例如
pos=2

{"1": 3, "2": 6}
或者一个元组列表/元组

[("1",3), ("2", 6)]
使用
dict comprehension
很容易,但是数据结构更复杂,我想动态地指定要提取的内容。前面的例子是我想要实现的最简单的事情

过了一会儿,我设法解决了它如下

从glom导入glom,T
元素=[{id:“1”,“计数”:[1,2,3]},{id:“2”,“计数”:[4,5,6]}]
def提取(元件、位置):
extracted=glom(元素,({“元素”:[lambda v:[v[“id”],v[“counts”][pos])},T))
返回dict(提取的[“元素”])
但这需要调用
dict
。一个略过字典的间接变化是

def提取(元素、位置):
extracted=glom(元素,([lambda v:{v[“id”]:v[“counts”][pos]}]),T))
返回{k:v for d in extracted for k,v in d.items()}
现在,我可以使用
merge
函数调用
glom
调用返回的值

def提取(元素、位置):
返回合并(glom(元素,([lambda v:{v[“id”]:v[“counts”][pos]}]),T)))
我对此相当满意,但有更好的方法吗?我的意思是建立一个可调用的清洁规范?最后,我希望能够在运行时以用户友好的方式定义字典的值,即
v[“counts”][pos]

对这个想法的一个改进是使用一个可调用函数来调用内部字典的值

def计数\u位置(元素,**kwargs):
返回元素[“计数”][kwargs[“位置”]]
def提取(元素、函数、**kwargs):
返回合并(glom(元素,([lambda v:{v[“id”]:func(v,**kwargs)}]),T)))
提取(值、计数和位置,位置=2)

这样,就可以从外部控制从每个元素中提取的内容。

要将每个元素中带有
id
的dict列表转换为id键控dict,您可以使用简单的dict理解:

{t["id"]: glom.glom(t, "counts.2") for t in elements}
或者,如果你想用glom来做这个:


为了避免lambdas,您可以在规范字符串中插入
pos
参数,例如
计数。%s'%pos

FWIW,我不明白为什么需要glom以及如何评估清洁度(“构建一个可调用的清洁规范”)……对于这个示例来说很愚蠢,但这是一个玩具示例。我并不需要glom,但我正在探索如何使用它构建某种灵活的方法,从大量嵌套字典中提取数据,而不必预先创建不同的函数。关于“清洁度”,我不知道如何评价它,但我的解决方案感觉很麻烦。问题是我不知道你们在哪里需要这种灵活性。我可以猜你的意思是“我想写一个函数
提取(值,访问器,pos)
,其中
总是一个目录列表,具有
id
和不同的其他键,
访问器
由用户提供(例如
v[“counts”][pos]
),我的代码将使用用户提供的
accessor
和不同的
pos
”值来调用它。如果这一点是固定的,那么将glom调用“放在”dict理解中可能会更清楚:
{t[“id”]:glom.glom(t,“counts.2”)for t in elements}
(否则这将是
glom.glom)(元素,glom.Merge([{T['id']:'counts.2'}]))
)至于使用<代码> POS < /Cord> PARAM,如何将它插入到一个字符串中,比如 >计数。%s’%POS < /代码>?否则,我认为更实际的例子将有助于提供一个好的答案。太好了!
glom.glom(elements, glom.Merge([{T['id']: 'counts.2'}])))