如何使用Python和Django从嵌套对象数组中提取items的id属性值
需求说明
我有如下结构的对象数组:
"output": [ { "id": 1, "items": [ { "id":"1", "data": { "id": 3 } }, { "id": "2", "data": { "id": 4 } } ] }, { "id": 2, "items": [ { "id":"3", "data": { "id": 5 } } ] } ]
我需要提取所有items数组中的id属性存入新数组,预期输出结果为['1','2','3']。
我知道JavaScript中可以通过如下代码实现:
arr_obj.map(obj=>obj.items.map(item=>item.id)).flat()
我是Python和Django的新手,请问在Python和Django中该如何实现上述需求?
补充:控制台打印的原始数据格式示例如下:
output '[{'id': 1,'items': [{'id': 14, 'data': {'id': 1,}},}]'
实现方法
方法1:嵌套列表推导式(最推荐,写法简洁)
直接用Python内置的列表推导式即可实现,效果和你写的JS代码完全一致:
# 假设你的原始数据存储在变量output_arr中 result = [item['id'] for obj in output_arr for item in obj['items']]
如果你在Django中处理的是模型实例而非字典,把中括号取值换成点语法即可:
result = [item.id for obj in queryset for item in obj.items.all()]
方法2:兼容缺省字段的写法
如果部分对象可能不存在items字段、或者部分item不存在id字段,可加缺省判断避免报错:
result = [item.get('id') for obj in output_arr for item in obj.get('items', [])]
方法3:大数组高性能写法
如果数据量非常大,可以用itertools.chain优化内存占用:
from itertools import chain all_items = chain.from_iterable(obj['items'] for obj in output_arr) result = [item['id'] for item in all_items]
内容的提问来源于stack exchange,提问作者stackuser
相关产品推荐
相关产品推荐

