Python中如何将嵌套列表的唯一值替换为对应索引值?
把嵌套列表中的唯一值替换为对应索引的方法
这问题我之前处理嵌套数据的时候也遇到过,核心思路其实很清晰:先把你的unique_sample转成值到索引的映射字典,然后遍历嵌套列表的每一层元素,用字典快速查找对应的索引就行。下面分两种场景给你具体实现方案:
场景1:嵌套层级固定(比如只有两层列表)
如果你的样本嵌套列表只有固定的两层(比如外层是列表,内层也是列表,没有更深的嵌套),用嵌套列表推导式就能快速搞定,代码简洁又高效:
# 假设你的唯一值列表和样本数据是这样的 unique_sample = ['apple', 'banana', 'cherry', 'date'] sample_nested = [['apple', 'banana'], ['cherry', 'apple'], ['date', 'banana', 'cherry']] # 第一步:创建值到索引的映射字典,用enumerate更直观 value_to_index = {val: idx for idx, val in enumerate(unique_sample)} # 第二步:遍历嵌套列表,替换每个元素为对应索引 result = [[value_to_index[item] for item in sublist] for sublist in sample_nested] print(result) # 输出结果:[[0, 1], [2, 0], [3, 1, 2]]
场景2:嵌套层级不固定(存在多层嵌套)
如果你的列表嵌套深度不确定(比如里面还有子列表的子列表),那写个递归函数会更稳妥,能自动处理任意层级的嵌套:
def replace_nested_with_index(nested_list, value_map): processed_list = [] for element in nested_list: if isinstance(element, list): # 如果当前元素是列表,递归处理它 processed_list.append(replace_nested_with_index(element, value_map)) else: # 如果是单个元素,直接查映射字典替换 processed_list.append(value_map[element]) return processed_list # 测试多层嵌套的情况 deep_nested_sample = [['apple', ['banana', 'cherry']], 'date', [['apple'], 'cherry']] deep_result = replace_nested_with_index(deep_nested_sample, value_to_index) print(deep_result) # 输出结果:[[0, [1, 2]], 3, [[0], 2]]
额外注意点:处理不存在的元素
如果你的样本列表里可能存在unique_sample中没有的值,直接用value_to_index[item]会抛出KeyError。这时候可以用字典的get()方法设置默认值,比如把不存在的元素替换为-1:
# 修改列表推导式的写法 safe_result = [[value_to_index.get(item, -1) for item in sublist] for sublist in sample_nested] # 递归函数里也可以同理修改 def safe_replace_nested(nested_list, value_map): processed = [] for elem in nested_list: if isinstance(elem, list): processed.append(safe_replace_nested(elem, value_map)) else: processed.append(value_map.get(elem, -1)) return processed
内容的提问来源于stack exchange,提问作者ThomasJohnson
相关产品推荐
相关产品推荐

