You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效遍历嵌套数据结构?替代嵌套for循环的更优方案

嵌套数据结构的优雅遍历方案

问题描述

我有如下嵌套数据结构(实际还有更多深层级的同类数据),目前用嵌套for循环实现遍历,但想找更优雅的替代方案,查过itertools库没找到合适的方法。

数据示例:

data = [ 
    {'region': 'EU',
     'users' : [
         { 'id': 1, 'name': 'xyz'},
         { 'id': 2, 'name': 'foo'} 
    ]},
    {'region': 'NA',
     'users' : [
         { 'id': 1, 'name': 'bar'},
         { 'id': 2, 'name': 'foo'},
         { 'id': 3, 'name': 'foo'} 
    ]},
]

当前实现代码:

for region in data:
    for user in region['users']:
        print(f'Region {region["region"]} User id {user["id"]}')

优雅替代方案

1. 自定义生成器函数

用生成器把嵌套结构扁平化,遍历逻辑更简洁且可复用:

def flatten_regions_users(data):
    for region_item in data:
        region_name = region_item['region']
        for user in region_item['users']:
            yield region_name, user['id'], user['name']

# 使用生成器遍历
for region, user_id, user_name in flatten_regions_users(data):
    print(f'Region {region} User id {user_id}')

如果存在更深层级(比如用户节点下还有列表子结构),可以改成递归生成器:

def flatten_nested_data(items):
    for item in items:
        if 'region' in item and 'users' in item:
            region_name = item['region']
            for user in item['users']:
                # 若用户节点含子列表,递归处理
                if isinstance(user, dict) and any(isinstance(v, list) for v in user.values()):
                    yield from ((region_name, sub) for sub in flatten_nested_data([user]))
                else:
                    yield region_name, user['id'], user['name']
        elif isinstance(item, list):
            yield from flatten_nested_data(item)

# 递归遍历示例
for region, user_id, _ in flatten_nested_data(data):
    print(f'Region {region} User id {user_id}')

2. 列表推导式(适合一次性批量处理)

如果只是需要生成所有用户的关联信息列表,列表推导式会更紧凑:

user_info = [(region['region'], user['id']) for region in data for user in region['users']]
for region, user_id in user_info:
    print(f'Region {region} User id {user_id}')

3. itertools.chain配合生成器(适配两层结构)

虽然你提到查过itertools,但itertools.chain可以结合生成器表达式快速扁平化两层结构:

import itertools

flattened = itertools.chain.from_iterable(
    ((region['region'], user['id']) for user in region['users']) 
    for region in data
)

for region, user_id in flattened:
    print(f'Region {region} User id {user_id}')

内容的提问来源于stack exchange,提问作者MK1986

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:35:18