如何高效遍历嵌套数据结构?替代嵌套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
相关产品推荐
相关产品推荐

