如何从列表中每个字典的非空嵌套列表随机提取值?
从字典列表中随机提取非空嵌套值的实现方案
给定如下字典列表,需要对每个字典随机提取一个非空列表中的值,最终得到包含3个值的结果列表(例如['b1','b6','d9']或['e1','c4','a7']):
l = [ {'A':[],'B':['b1','b2'],'C':[],'D':['d1','d2','d3'],'E':['e1']}, {'A':['a4','a5','a6'],'B':['b6'],'C':['c4','c5','c6'],'D':[],'E':['e4','e5','e6']}, {'A':['a7'],'B':['b7','b8'],'C':['c7','c8','c9'],'D':['d7','d8','d9'],'E':[]}, ]
使用random.choice()时可能会选中空列表,需要重试直到选中非空列表,以下是两种可行的实现方式:
方法一:循环重试直到选中非空列表
直接针对每个字典循环随机选择键对应的列表,直到拿到非空列表后再从中提取值:
import random result = [] for dic in l: while True: selected_list = random.choice(list(dic.values())) if selected_list: result.append(random.choice(selected_list)) break print(result)
方法二:先过滤非空列表再随机选择
提前过滤每个字典中的非空列表,再从过滤后的集合中随机选择,避免无效重试,效率更高:
import random result = [] for dic in l: # 筛选当前字典中的所有非空列表 valid_lists = [lst for lst in dic.values() if lst] # 先随机选一个非空列表,再从中随机选值 result.append(random.choice(random.choice(valid_lists))) print(result)
注:方法二的逻辑更高效,因为它直接排除了空列表,不需要反复尝试;方法一逻辑更直观,适合理解基础流程。
内容的提问来源于stack exchange,提问作者JK2018
相关产品推荐
相关产品推荐

