Python:如何从名称、特征列表随机抽取键值对生成字典并优化代码
随机键值对字典生成实现
核心实现思路
完全脱离预定义固定字典的逻辑,核心分三步:
- 拆分独立数据源:将姓名、特征分别存储在两个无关联的独立列表中
- 无重复随机抽取:从姓名列表中不放回抽取指定数量的姓名作为字典键,避免同名字典键被覆盖
- 随机匹配赋值:为每个抽取的姓名,从特征列表中随机匹配对应的特征作为字典值,写入空字典
注:随机生成时出现字典内容不符合预期的常见原因,是抽取姓名时没有做去重处理,直接重复调用随机选择会导致字典键重复,后续值直接覆盖前面的条目,最终字典长度远小于预期值。
基础可运行实现代码
import random # 独立数据源列表 name_pool = ['john', 'sarah', 'bill', 'eric', 'lisa', 'tom', 'mia', 'jack'] trait_pool = ['sickly', 'night owl', 'nudist', 'none', 'early bird', 'gourmet', 'insomniac'] # 设置生成的殖民者数量,和原代码规模保持一致 colonist_count = 4 # 从姓名池无放回随机抽取,避免重名冲突 random_names = random.sample(name_pool, k=colonist_count) colonists = {} for name in random_names: # 为每个名字随机匹配一个特征 random_trait = random.choice(trait_pool) colonists[name] = random_trait events = ['plague', 'day', 'clothes', 'none'] current_event = random.choice(events) print(f"当前触发事件:{current_event}") for name, trait in colonists.items(): if current_event == 'clothes' and trait == 'nudist': print(f"{name.capitalize()} 因拥有 {trait} 特质受到事件影响") elif current_event == 'day' and trait == 'night owl': print(f"{name.capitalize()} 因拥有 {trait} 特质受到事件影响") elif current_event == 'plague' and trait == 'sickly': print(f"{name.capitalize()} 因拥有 {trait} 特质受到事件影响") else: print(f"{name.capitalize()} 因拥有 {trait} 特质未受当前事件影响")
代码优化建议
- 精简冗余分支判断:原代码针对事件和特质的匹配逻辑编写了多段if/elif分支,后续新增事件或特质时需要反复修改分支逻辑,可提前维护事件和对应敏感特质的映射关系,压缩判断代码量
优化后的前置维护逻辑:
# 提前维护事件对应的受影响特质,新增规则只需要修改这个映射表即可 event_sensitive_trait = { 'plague': 'sickly', 'day': 'night owl', 'clothes': 'nudist' }
对应循环内的判断逻辑可以简化为:
sensitive_trait = event_sensitive_trait.get(current_event) is_suffering = sensitive_trait == trait status_text = "受到事件影响" if is_suffering else "未受当前事件影响" print(f"{name.capitalize()} 因拥有 {trait} 特质{status_text}")
- 灵活调整生成规模:如果后续需要生成更多殖民者,只需要修改
colonist_count的数值即可,只要取值不超过姓名池的总长度就不会触发报错 - 自定义特征出现概率:如果不想让特质完全均匀随机,也可以给每个特质设置出现权重,比如提高“none”特质的出现比例,只需要把
random.choice(trait_pool)替换为带权重的随机选择逻辑即可
内容的提问来源于stack exchange,提问作者eric22
相关产品推荐
相关产品推荐

