Python – перебор вложенных словарей для заполнения списка на основе значений – объект встречи «str» не имеет атрибута «iPython

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Python – перебор вложенных словарей для заполнения списка на основе значений – объект встречи «str» не имеет атрибута «i

Сообщение Гость »

Я создаю код, который должен позволить пользователю выбирать несколько объектов из списка.
Каждому пользователю выделено пространство, и каждый объект имеет определенный размер.
Я пытаясь заполнить список на основе редкости объекта и отображать только те элементы, размер которых равен или меньше отведенного пользователю пространства.
Однако, как только пользователь выбрал объект, и список обновляется только теми объектами, которые находятся в пределах оставшегося диапазона размеров, код для отображения списка больше не работает, и появляется следующая ошибка:
AttributeError: ' объект str' не имеет атрибута item

Код: Выделить всё

user_stage1_objects = []
selected_objects_size = 0

timeframe1 = {
"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}]
}
}

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

def stage1_selection():
global max_amount_limit, selected_objects_size, available_objects_list, user_stage1_objects

objects_chosen = None

user_stage1_objects = []
available_objects_list = []

timeframe_choice = input("""
Select Timeframe1 or Timeframe2
1 - Timeframe1
2 - Timeframe2
> """)
if timeframe_choice == "1":
chosen_timeframe = timeframe1
elif timeframe_choice == "2":
chosen_timeframe = timeframe2
else:
print("Not a valid choice, try again")

while objects_chosen is None:
if (max_amount_limit - selected_objects_size) > 3:
if chosen_timeframe == timeframe1:
available_objects_list = timeframe1["Option1"]["Common"]
elif chosen_timeframe == timeframe2:
available_objects_list = timeframe2["Option2"]["Common"]
elif (max_amount_limit - selected_objects_size) < 4:
available_objects_list = []
if chosen_timeframe == timeframe1:
available_objects_list = {
options: {
rarity: [
item for item in items
if item["Size"] < 4
]
for rarity, items in options.items()
if rarity == "Common"
}
for option, options in timeframe1.items()
if option == "Option1"
}
elif chosen_timeframe == timeframe2:
available_objects_list = {
options: {
rarity: [
item for item in items
if item["Size"] < 4
]
for rarity, items in options.items()
if rarity == "Common"
}
for option, options in timeframe2.items()
if option == "Option1"
}
elif (max_amount_limit - selected_objects_size) <  3:
available_objects_list = []
if chosen_timeframe == timeframe1:
available_objects_list = {
options: {
rarity: [
item for item in items
if item["Size"] < 3
]
for rarity, items in options.items()
if rarity == "Common"
}
for option, options in timeframe1.items()
if option == "Option1"
}
elif chosen_timeframe == timeframe2:
available_objects_list = {
options: {
rarity: [
item for item in items
if item["Size"] < 3
]
for rarity, items in options.items()
if rarity == "Common"
}
for option, options in timeframe2.items()
if option == "Option1"
}

object_availability = available_objects_list
object_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)
user_stage1_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 Option1, or move on to Option2?
1 - Continue with Option1
2 - Move on to Option2

>""")

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")

def fill_chosen_objects():
global max_amount_limit, selected_objects_size, available_objects_list, user_stage1_objects

max_amount_limit = 5

selecting_objects = input("""
Would you like to see available choices from Option1?

1 - Yes
2 - No

> """)

if selecting_objects == "1":
stage1_selection()
elif selecting_objects == "2":
objects_chosen = "Done"

return user_stage1_objects

fill_chosen_objects()

Извините за длинный код, но я уже пробовал публиковать меньшие фрагменты кода, и то, что работает, похоже, не работает при применении к более крупной базе кода. >
По сути, пользователь никогда не должен видеть объекты размером больше, чем тот, который у него остался после учета max_amount_limit — накопленных элементов, которые он уже выбрал.
Я вижу список объектов с первого раза, но он вылетает, когда я пытаюсь просмотреть список и выбрать второй объект.
The AttributeError: 'str ' у объекта нет атрибута 'items', в этой строке появляется ошибка

Код: Выделить всё

for key, val in i.items():
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/781 ... d-on-value
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»