Проблема со словарем (ошибка типа: строковые индексы должны быть целыми числами)

#python #python-3.x #dictionary

Вопрос:

Итак, я новый пользователь этого сайта, и у меня проблема с функцией словаря.

 den = {
    'first_name': 'den',
    'last_name': 'elc',
    'age': '16',
    'city': 'slovakia',
}
for user, user_info in den.items():
    nameo = user_info['first_name']
    namei = user_info['last_name']
    age = user_info['age']
    city = user_info['city']
    print(f"tFirst name:{nameo}")
    print(f"tLast_name:{namei}")
    print(f"tAge:{age}")
    print(f"tCity:{city}")
 

Python печатает этот тип ошибки:

     Traceback (most recent call last):
  File "D:/PyCharm Community/pycharm/venv/Test.py", line 15, in <module>
    nameo = user_info['first_name']
TypeError: string indices must be integers
 

Какие-нибудь предположения?

Комментарии:

1. Зачем вообще здесь петля?

2. когда вы делаете user, user_info, user_info принимает значения значений словаря, поэтому эти r некоторые строки и сами строки не могут иметь строковые индексы, верно? Например, для Если у вас есть строка 'hi' , то эта строка имеет два индекса 0 и 1, но у нее не может быть индекса по имени 'first_name' , верно?. Поэтому вместо этого вам следует взять только одну переменную цикла, а затем попробовать это, это будет работать так -: for user_info in den : . Теперь вы можете получить значения, как вы хотели, используя -: user_info['first_name']

3. Также кажется, что вы хотите хранить информацию более чем об одном таком пользователе, но вы перебираете словарь, содержащий информацию только об одном пользователе, поэтому создайте больший словарь с ними в качестве дополнительных словарей, тогда он должен работать.

Ответ №1:

В этом случае вам не нужен цикл for, если у вас есть массив словарей, вам нужно рассмотреть возможность использования цикла for. Здесь вы можете просто сделать, как показано ниже.

 den = {
    'first_name': 'den',
    'last_name': 'elc',
    'age': '16',
    'city': 'slovakia',
}
print(f"tFirst name:{den['first_name']}")
print(f"tLast_name:{den['last_name']}")
print(f"tAge:{den['age']}")
print(f"tCity:{den['city']}")
 

Ответ №2:

Вы можете использовать .title() и делать это, как показано ниже:

 den = {
    'first_name': 'den',
    'last_name': 'elc',
    'age': '16',
    'city': 'slovakia',
}
for k,v in den.items():
    print(f't{k.title()}:{v}')
 

Выход:

     First_Name:den
    Last_Name:elc
    Age:16
    City:slovakia
 

Ответ №3:

Первая проблема здесь заключается в том, что вы пытаетесь извлечь строковые индексы из самой строки. Это связано с тем, что при повторении den.items() вы повторяете его ключи и значения как user и user_info соответственно.

Таким образом, для каждой итерации цикла -: пользователь = ключ user_info = val

Теперь, если вы заметили, что словарь, который вы используете, содержит значения в виде строк. Например, если у вас есть строка, скажем 'hi' . Тогда эта строка имеет два индекса, которые могут быть представлены только целыми числами 0, 1 или -1, -2. Но что, если мы сделаем это вместо этого?

 a = 'hi'
print(a['first_name'])
 

Это приведет к ошибке здесь, потому что индексы строки, как вы могли бы заметить здесь, не могут быть строкой.

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

 users = {
    {
     'first_name': 'den',
     'last_name': 'elc',
     'age': '16',
     'city': 'slovakia',
     },
    {
     'first_name': 'den_2',
     'last_name': 'elc_2',
     'age': '19',
     'city': 'romania',
    },
}
 

Теперь ваш старый код, повторяющий элементы этого диктанта, будет работать нормально!

 for user, user_info in users.items():
    nameo = user_info['first_name']
    namei = user_info['last_name']
    age = user_info['age']
    city = user_info['city']
    print(f"tFirst name:{nameo}")
    print(f"tLast_name:{namei}")
    print(f"tAge:{age}")
    print(f"tCity:{city}")