使用 Python 模块 Glom,将不规则的嵌套列表提取到扁平化的字典列表中
Using Python module Glom, Extract Irregular Nested Lists into a Flattened List of Dictionaries
Glom 使访问复杂的嵌套数据结构变得更加容易。
https://github.com/mahmoud/glom
给定以下玩具数据结构:
target = [
{
'user_id': 198,
'id': 504508,
'first_name': 'John',
'last_name': 'Doe',
'active': True,
'email_address': 'jd@test.com',
'new_orders': False,
'addresses': [
{
'location': 'home',
'address': 300,
'street': 'Fulton Rd.'
}
]
},
{
'user_id': 209,
'id': 504508,
'first_name': 'Jane',
'last_name': 'Doe',
'active': True,
'email_address': 'jd@test.com',
'new_orders': True,
'addresses': [
{
'location': 'home',
'address': 251,
'street': 'Maverick Dr.'
},
{
'location': 'work',
'address': 4532,
'street': 'Fulton Cir.'
},
]
},
]
我正在尝试将数据结构中的所有地址字段提取到扁平化的字典列表中。
from glom import glom as glom
from glom import Coalesce
import pprint
"""
Purpose: Test the use of Glom
"""
# Create Glomspec
spec = [{'address': ('addresses', 'address') }]
# Glom the data
result = glom(target, spec)
# Display
pprint.pprint(result)
以上规范规定:
[
{'address': [300]},
{'address': [251]}
]
期望的结果是:
[
{'address':300},
{'address':251},
{'address':4532}
]
什么 Glomspec 会生成所需的结果?
从 glom 19.1.0 开始,您可以使用 Flatten()
spec 来简洁地获得您想要的结果:
from glom import glom, Flatten
glom(target, (['addresses'], Flatten(), [{'address': 'address'}]))
# [{'address': 300}, {'address': 251}, {'address': 4532}]
仅此而已!
您可能还想查看 the convenient flatten() function, as well as the powerful Fold() spec,以满足您所有的扁平化需求:)
在 19.1.0 之前,glom 没有 first-class 展平或缩减(如在 map-reduce 中)功能。但一种解决方法是使用 Python 的内置 sum()
函数来展平地址:
>>> from glom import glom, T, Call # pre-19.1.0 solution
>>> glom(target, ([('addresses', [T])], Call(sum, args=(T, [])), [{'address': 'address'}]))
[{'address': 300}, {'address': 251}, {'address': 4532}]
三个步骤:
- 像您一样遍历列表。
- 在结果列表上调用sum,flattening/reducing它。
- 过滤结果列表中的项目以仅包含
'address'
键。
注意 T
的用法,它代表当前目标,有点像光标。
无论如何,不再需要这样做了,部分原因是这个答案。所以,谢谢你的好问题!
Glom 使访问复杂的嵌套数据结构变得更加容易。 https://github.com/mahmoud/glom
给定以下玩具数据结构:
target = [
{
'user_id': 198,
'id': 504508,
'first_name': 'John',
'last_name': 'Doe',
'active': True,
'email_address': 'jd@test.com',
'new_orders': False,
'addresses': [
{
'location': 'home',
'address': 300,
'street': 'Fulton Rd.'
}
]
},
{
'user_id': 209,
'id': 504508,
'first_name': 'Jane',
'last_name': 'Doe',
'active': True,
'email_address': 'jd@test.com',
'new_orders': True,
'addresses': [
{
'location': 'home',
'address': 251,
'street': 'Maverick Dr.'
},
{
'location': 'work',
'address': 4532,
'street': 'Fulton Cir.'
},
]
},
]
我正在尝试将数据结构中的所有地址字段提取到扁平化的字典列表中。
from glom import glom as glom
from glom import Coalesce
import pprint
"""
Purpose: Test the use of Glom
"""
# Create Glomspec
spec = [{'address': ('addresses', 'address') }]
# Glom the data
result = glom(target, spec)
# Display
pprint.pprint(result)
以上规范规定:
[
{'address': [300]},
{'address': [251]}
]
期望的结果是:
[
{'address':300},
{'address':251},
{'address':4532}
]
什么 Glomspec 会生成所需的结果?
从 glom 19.1.0 开始,您可以使用 Flatten()
spec 来简洁地获得您想要的结果:
from glom import glom, Flatten
glom(target, (['addresses'], Flatten(), [{'address': 'address'}]))
# [{'address': 300}, {'address': 251}, {'address': 4532}]
仅此而已!
您可能还想查看 the convenient flatten() function, as well as the powerful Fold() spec,以满足您所有的扁平化需求:)
在 19.1.0 之前,glom 没有 first-class 展平或缩减(如在 map-reduce 中)功能。但一种解决方法是使用 Python 的内置 sum()
函数来展平地址:
>>> from glom import glom, T, Call # pre-19.1.0 solution
>>> glom(target, ([('addresses', [T])], Call(sum, args=(T, [])), [{'address': 'address'}]))
[{'address': 300}, {'address': 251}, {'address': 4532}]
三个步骤:
- 像您一样遍历列表。
- 在结果列表上调用sum,flattening/reducing它。
- 过滤结果列表中的项目以仅包含
'address'
键。
注意 T
的用法,它代表当前目标,有点像光标。
无论如何,不再需要这样做了,部分原因是这个答案。所以,谢谢你的好问题!