Python如何查找列表最小值对应的关联猜测选项
问题原因
你当前的compareExpect列表仅存储了孤立的剩余候选人数期望值,没有建立数值和对应提问选项的关联关系,因此无论直接取最小值还是用列表推导筛选,都只能拿到数值本身,无法定位到对应的提问。你之前写的列表推导逻辑仅遍历提取了列表里的数值,没有关联选项信息,自然无法解决问题。
推荐解决方案
最稳妥的实现方式是调整存储结构,将每个期望值和它对应的提问选项绑定存储,从根源上避免顺序错位、关联丢失的问题。
- 重构
compareExpect的结构,用元组同时存储期望值和对应提问:
# 元组第一位为该提问的剩余候选人数期望值,第二位为对应的提问内容/标识 compareExpect = [ (blackHairExpect, "询问角色是否为黑发"), (blondeHairExpect, "询问角色是否为金发"), # 其余提问按相同格式追加即可 ]
- 直接对绑定后的列表取最小值,Python对元组做比较时会优先对比第一位的期望值数值,自动返回期望值最小的项,拆包就能同时拿到最小期望值和对应的最优提问:
minExpect, bestQuestion = min(compareExpect)
- 如果需要获取所有期望值并列最小的提问,可以按如下方式筛选:
# 先拿到最小期望值 minExpect = min(item[0] for item in compareExpect) # 筛选所有符合最小期望值的提问 allBestQuestions = [q for exp, q in compareExpect if exp == minExpect]
备选方案(不推荐)
如果你暂时不想调整现有compareExpect的纯数值结构,可以额外维护一个和compareExpect顺序完全一致的提问列表,通过最小值的下标匹配对应提问:
# 注意:该列表顺序必须和compareExpect里的期望值严格一一对应 questionList = [ "询问角色是否为黑发", "询问角色是否为金发", # 其余提问顺序必须和期望值顺序完全匹配 ] minExpect = min(compareExpect) # 找到最小值在列表中的第一个下标 bestIdx = compareExpect.index(minExpect) bestQuestion = questionList[bestIdx]
注意:该方案容错率极低,一旦后续修改代码时调整了某一个列表的元素顺序、新增/删除元素没有同步修改另一个列表,就会出现提问和期望值错配的bug;且如果存在多个并列最小值,
index()只会返回第一个匹配项的位置。
内容的提问来源于stack exchange,提问作者ChrisLearnsCoding
相关产品推荐
相关产品推荐

