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

Python:基于嵌套字典值筛选并追加元素至列表的问题

问题:基于剩余限额筛选嵌套字典中的可选对象

需求:编写Python代码展示用户可选对象列表,每个对象带Size属性,初始总限额为5,选中对象后从剩余限额扣除对应Size值;后续仅显示Size不超过剩余限额的对象(如剩余限额2时,不显示Size为3的对象),目前其他功能正常,仅过滤功能未实现。

原始代码(标注待完善位置):

set1_items = {
    "Option1": {
        "Common": [
            {"Item Name": "A1", "Size": 3},
            {"Item Name": "A2", "Size": 4}
        ],
        "Uncommon": [
            {"Item Name": "B1", "Size": 2},
            {"Item Name": "B2", "Size": 1}
        ]
    },
    "Option2": {
        "Common": [
            {"Item Name": "C1", "Size": 3},
            {"Item Name": "C2", "Size": 1}
        ],
        "Uncommon": [
            {"Item Name": "D1", "Size": 2},
            {"Item Name": "D2", "Size": 4}
        ]
    }
}

chosen_objects = []

objects_chosen = None
max_amount_limit = 5
selected_objects_size = 0
available_objects_list = []

while objects_chosen is None:
    if (max_amount_limit - selected_objects_size) > 3:
        available_objects_list = set1_items["Option1"]["Common"]
    elif (max_amount_limit - selected_objects_size) <4:
        available_objects_list = set1_items["Option1"]["Common"]?????

    object_availability = available_objects_list
    objects_itr = 0
    for i in object_availability:
        print(object_itr, end=' - ')
        for key, val in i.items():
            print(key, ": ", val, end='\n    ')
        print()
        object_itr = object_itr+1

    chosen_object_index = input("> ")
    chosen_object_index = int(chosen_object_index)
    chosen_objects.append(object_availability[chosen_object_index]["Item Name"])

    selected_objects_size = selected_objects_size + object_availability[chosen_object_index]["Size"]

    if max_amount_limit == selected_objects_size:
        objects_chosen = "Done"
    else:
        continue_object_selection = input("""
You have """+str(int(max_amount_limit - selected_objects_size))+""" amounts left.

Do you want to select more objects from Set 1, or move on to Set 2?
1 - Continue with Set 1
2 - Move on to Set 2

>""")

        if continue_object_selection == "1":
            objects_chosen = None
        elif continue_object_selection == "2":
            objects_chosen = "Done"
        else:
            print("Not a valid choice, try again")
解决方案

核心是通过列表推导式对嵌套字典中的对象列表进行过滤,保留Size不超过剩余限额的元素。

修改后的关键代码部分:

while objects_chosen is None:
    # 计算当前剩余限额
    remaining_limit = max_amount_limit - selected_objects_size
    # 筛选Set1 Option1中所有Size <= 剩余限额的对象(可按需合并Common/Uncommon)
    available_objects_list = [
        item 
        for category in set1_items["Option1"].values() 
        for item in category 
        if item["Size"] <= remaining_limit
    ]

    # 后续原有代码保持不变...

说明:

  1. 先计算remaining_limit得到当前剩余限额,避免重复计算;
  2. 用嵌套循环的列表推导式遍历set1_items["Option1"]下的所有分类(Common/Uncommon),再遍历每个分类里的对象;
  3. 通过if item["Size"] <= remaining_limit筛选符合条件的对象,自动生成过滤后的列表。

如果只需筛选Common分类,可简化为:

available_objects_list = [
    item 
    for item in set1_items["Option1"]["Common"] 
    if item["Size"] <= remaining_limit
]

替换原始代码中available_objects_list的赋值逻辑,即可实现动态过滤功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:23:26