Как добавить элемент в словарь в списке? - PullRequest
0 голосов
/ 04 мая 2020

Здравствуйте, я разрабатываю текстовую игру, и я борюсь с командой drop; это работает так: вы пишете «D название предмета », затем проверяет, действительно ли предмет находится в инвентаре, и если это так, помещает его в переменную, удаляет его из инвентаря, и я хочу, чтобы он добавлялся в индекс содержимого комнаты (словаря), и этот словарь находится в списке, и я не могу добавить его. это код (некоторые из них):

room = []
room.append({'number': 1, 'content': ""})
roomnumber = 1
inv = ["sword"]
command = input(": ")
first_letter = command(0)

if first_letter == "D":
   item = command.split(" ", 2)
   item.remove("D")
   for i in range(0, len(inv):
      inv.pop(i)
#this doesn't work
`     room[roomnumber]['content'].append(item[0])`
      item.pop(0)

После того, как я ввел: "D меч", он дает мне эту ошибку:

Traceback (most recent call last):
File "/Users/antony/PycharmProjects/TextBased/Main.py", line 54, in <module>
room[roomnumber]['content'].append(item[0])
AttributeError: 'str' object has no attribute 'append'

Я не понимаю Пожалуйста, помогите!

Ответы [ 3 ]

0 голосов
/ 04 мая 2020
room = []
room.append({'number': 1, 'content': ""})
## room = [{'number': 1, 'content': ""}]

roomnumber = 1
## you should actually change this to 0. Otherwise you will get an "index out
## of range" error (see comment below)

inv = ["sword"]
command = input(": ")
first_letter = command(0)

if first_letter == "D":
   item = command.split(" ", 2)
## why are you adding a max split here??

   item.remove("D")
   for i in range(0, len(inv)):
## equals for i in range(0, 5):, so iterates 0,1,2,3,4
## you forgot to add a closing bracket for the range

      inv.pop(i)
## what are you trying to do here? This looks strange to me, given that after each
## pop, the value of your inv will be shortened..?

#this doesn't work
      room[roomnumber]['content'].append(item[0])
## this does not work because your room list only contains one element, a 
## dictionary, at index position 0. Probably THIS is your biggest issue here. 
## Second, you're trying to change the value of 'content'. To change the value of a
## dictionarie's key, you need to use "=", and not ".append", as ".append" is used
## to append an element at the end of a list, to a list, and not to a dictionary. 
## So, use room[roomnumber]['content'] = item[0] 
      item.pop(0)

Из того, что я понял, вы хотите добавить контент, в зависимости от номера комнаты, к значению контента словаря соответствующего номера комнаты. В этом случае весь ваш синтаксис неверен, и вы должны использовать:

room = []
room.append({1:""})

## and then, after the rest of the code:

room[roomnumber-1][roomnumber] = item[0]

или, что еще проще, учитывая, что одновременное использование списков и словарей здесь фактически устарело

## initiate one dictionary, containing all the rooms in key = roomnumber
## value = content pairs
rooms = {}

## the syntax to add a new room number with a new content into the dictionary
## would then simply be: rooms[number] = content, e.g.:
rooms[1] = ""

## to then set the value of the content for a given roomnumber, you simply use
rooms[roomnumber] = item[0]

Я рекомендую вам узнать о базовых c различиях между списками и словарями в python, вам, кажется, не хватает базового c понимания того, как элементы списков и словарей доступны / изменены (без обид конечно )

0 голосов
/ 04 мая 2020

хорошо, спасибо большое, ребята :), я просто хотел сказать, что причина, по которой некоторые вещи немного странные, заключается в том, что это всего лишь около 20% кода (например, есть еще места для ведьмы, поэтому мне нужно было использовать словари в списке), и мой номер комнаты действительно начинается с 0 в моем фактическом коде :), всплывающее окно состоит в том, чтобы удалить предмет из инвентаря (потому что это команда сброса), и я удаляю его из переменной предмета, просто чтобы быть безопасно, что это не вызывает никаких нежелательных ошибок. и в противном случае, да, контент должен был быть списком, я забыл, спасибо за то, что указал на него, и для l oop фактически закрыл его (я был просто немного в ru sh, когда писал это) , В любом случае, спасибо всем:)

0 голосов
/ 04 мая 2020

Хотите ли вы, чтобы в комнате было больше одного предмета? Если это так, сделайте ваше поле content списком, а не строкой:

room.append({'number': 1, 'content': []})

Теперь вы можете append любое количество вещей в content.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...