根据嵌套字典对象的值将嵌套字典对象追加到列表中。PYTHON

0 投票
1 回答
45 浏览
提问于 2025-04-14 15:25

我在写一段代码,用来显示用户可以选择的对象列表时遇到了一些问题。每个对象都有一个“大小”,每当用户选择一个对象时,这个大小就会从用户可以选择的最大数量中减去。

简单来说,用户一开始可以选择的数量上限是5。每个对象的大小在1到4之间。

当用户第一次选择时,没有任何限制,但之后列表中显示的对象应该限制在用户剩余的可选数量之内。如果用户只剩下2的选择上限,他们就不应该看到大小为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 is None
        elif continue_object_selection == "2":
            objects_chosen - "Done"
        else:
            print("Not a valid choice, try again")

这是我代码的一个基本简化版本,我在需要添加内容的地方加了?????。

如果能提供一些帮助,我将非常感激,因为我找不到关于根据值将嵌套字典项添加到列表的相关资料。

谢谢。

1 个回答

1

你的问题里的示例代码无法运行,但我觉得你主要想知道的是如何过滤一个嵌套的字典。

如果是这样的话,我会使用列表推导式。

filtered = {
  option: {
    rarity: [
      item for item in items
        if item["Size"] <= max_amount_limit
    ]
      for rarity, items in options.items() 
  } 
    for option, options in set1_items.items() 
}

示例:https://trinket.io/python3/5c8666dcce

补充:关于如何过滤稀有度的例子,可以是动态的或者是硬编码的……

filtered = {
  option: {
    rarity: [
      item for item in items
        if item["Size"] <= max_amount_limit
    ]
      for rarity, items in options.items()
        if rarity == 'Common'
  } 
    for option, options in set1_items.items() 
}

或者……

filtered = {
  option: [
      item for item in options['Common']
        if item["Size"] <= max_amount_limit
  ]
    for option, options in set1_items.items() 
}

示例:https://trinket.io/python3/5835bd66c1

撰写回答