如何将多维列表及嵌套JSON数据转换为一维列表?
多维结构转一维的实用解决方法
Hey,针对你问的两个关于把多维结构转成一维的问题,我整理了几个实用的方案,你可以根据自己的场景选择:
1. 如何将多维列表转换为一维列表?
多维列表扁平化是很常见的需求,我平时常用这几种方法:
方法一:递归实现(通用款,支持任意深度)
如果你的嵌套列表深度不确定,递归是最稳妥的方式,逻辑也容易理解:
def flatten_list(nested_list): result = [] for item in nested_list: # 如果当前元素是列表,就递归展开后加入结果 if isinstance(item, list): result.extend(flatten_list(item)) else: result.append(item) return result # 示例调用 nested = [1, [2, [3, 4], 5], 6, [7, [8, [9]]]] print(flatten_list(nested)) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
方法二:列表推导式(适合浅嵌套,简洁高效)
如果你的列表最多只有一两层嵌套,用列表推导式写起来更短:
nested = [1, [2, 3], [4, 5], 6] flattened = [item for sublist in nested for item in sublist] print(flattened) # 输出: [1, 2, 3, 4, 5, 6] # 如果有部分元素不是列表,可以加个判断兼容 nested_mixed = [1, [2, 3], 4, [5, [6]]] flattened_mixed = [item for sublist in nested_mixed for item in (sublist if isinstance(sublist, list) else [sublist])] print(flattened_mixed) # 输出: [1, 2, 3, 4, 5, [6]] 注意:这个只能处理一层嵌套
方法三:用itertools.chain(工具类方案)
Python标准库的itertools里的chain方法专门用来拼接可迭代对象,配合from_iterable可以快速处理浅嵌套:
from itertools import chain nested = [1, [2, 3], [4, 5]] flattened = list(chain.from_iterable(nested)) print(flattened) # 输出: [1, 2, 3, 4, 5] # 深层嵌套的话,可以结合递归或者reduce from functools import reduce def flatten_deep(nested): return reduce(lambda x, y: x + flatten_deep(y) if isinstance(y, list) else x + [y], nested, []) print(flatten_deep([1, [2, [3, 4]]])) # 输出: [1, 2, 3, 4]
2. 嵌套JSON转换为扁平化字典的列表
你的需求是把嵌套的JSON数组里的每个对象,转成键用连字符连接的扁平化字典(比如food-spicy这种格式),我写了个递归函数来处理,完全匹配你的需求:
实现代码
def flatten_dict(nested_dict, parent_key='', sep='-'): items = [] for key, value in nested_dict.items(): # 拼接父键和当前键,用连字符分隔 new_key = f"{parent_key}{sep}{key}" if parent_key else key # 如果值还是字典,继续递归扁平化 if isinstance(value, dict): items.extend(flatten_dict(value, new_key, sep).items()) else: # 去掉键和值的首尾空格,和你示例格式一致 items.append((new_key.strip(), value.strip())) return dict(items) # 你的原始JSON数据 original_json = [ {"food": {"spicy": "spicy","sweet": "sweet"}, "water": {"sweet": "sweet","sour": {"cold": "ice lemon","hot": "lemon tea"}} }, {"food": {"spicy": "spicy","sweet": "sweet"}, "water": {"sweet": "sweet","sour": {"cold": "ice lemon","hot": "lemon tea"}} } ] # 批量转换每个对象 flattened_result = [flatten_dict(item) for item in original_json] # 打印结果看看 import pprint pprint.pprint(flattened_result)
输出结果
[{'food-spicy': 'spicy', 'food-sweet': 'sweet', 'water-sweet': 'sweet', 'water-sour-cold': 'ice lemon', 'water-sour-hot': 'lemon tea'}, {'food-spicy': 'spicy', 'food-sweet': 'sweet', 'water-sweet': 'sweet', 'water-sour-cold': 'ice lemon', 'water-sour-hot': 'lemon tea'}]
内容的提问来源于stack exchange,提问作者Daniel Mana
相关产品推荐
相关产品推荐

