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 ] # 后续原有代码保持不变...
说明:
- 先计算
remaining_limit得到当前剩余限额,避免重复计算; - 用嵌套循环的列表推导式遍历
set1_items["Option1"]下的所有分类(Common/Uncommon),再遍历每个分类里的对象; - 通过
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
相关产品推荐
相关产品推荐

