You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于相同键名随机筛选Python字典列表的优化实现方案问询

更优实现方案:按主题随机选取两个问题字典

需求回顾

从给定的字典列表中,为每个主题键随机选取两个对应的字典,组成新的字典列表。例如从包含不同主题问题的列表中,每个主题挑2个随机问题,最终输出由这些单键字典组成的新列表。

现有代码的问题

  1. 第一段代码最终得到的是问题链接的扁平列表,而非目标格式的字典列表,需要额外转换才能符合要求。
  2. 第二段代码通过remove修改了原arrange中的列表,会破坏原始数据;且循环调用random.choice加remove的方式,效率低于直接批量采样。

优化方案

方案1:简洁分组+批量采样(无副作用)

先通过collections.defaultdict完成主题分组,再用random.sample批量选取每个主题的2个问题,最后生成目标字典列表,全程不修改原始数据:

from collections import defaultdict
import random

existing_list = [{'topic1': 'question1'}, {'topic2': 'question2'}, {'topic3': 'question3'}, {'topic2': 'question4'}, {'topic2': 'question5'}, {'topic1': 'question2'}, {'topic1': 'question3'}, {'topic3': 'question5'}, {'topic3': 'question6'}]

# 按主题分组问题
arrange = defaultdict(list)
for item in existing_list:
    topic, question = next(iter(item.items()))  # 提取单键字典的键值对
    arrange[topic].append(question)

# 生成目标列表
new_list = []
for topic, questions in arrange.items():
    # 随机选2个不重复的问题
    selected_questions = random.sample(questions, 2)
    new_list.extend([{topic: q} for q in selected_questions])

方案2:列表推导式紧凑写法

如果追求代码简洁,可以把生成逻辑合并为嵌套列表推导式,可读性和效率都不错:

new_list = [
    {topic: question}
    for topic, questions in arrange.items()
    for question in random.sample(questions, 2)
]

方案优势

  • 用defaultdict简化分组逻辑,比setdefault更直观。
  • 用random.sample一次性完成2个问题的随机选取,避免循环操作,效率更高。
  • 全程不修改原始分组数据,无副作用,后续可继续使用原始数据。
  • 直接生成目标格式的字典列表,无需额外转换步骤。

内容的提问来源于stack exchange,提问作者prem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:15:47