Я хочу создать словарь, в котором будут храниться полные названия 50 состояний в слове и сокращения в значении с учетом списка имен и сокращений. Я ожидаю словарь вроде {'Алабама': 'AK', 'Аляска': 'AL', ...}. я пытался
state_to_abbrev = {}
for word in states:
for i in range(50):
state_to_abbrev[word] = states[i]
state_to_abbrev[word] = abbreviations[i]
state_to_abbrev
И я получаю {'Alabama': 'WY', «Аляска»: «Вайоминг», "Аризона": "Вайоминг", "Арканзас": "Вайоминг", "Калифорния": "Вайоминг", "Колорадо": "Вайоминг", «Коннектикут»: «Вайоминг», "Делавэр": "Вайоминг", "Флорида": "Вайоминг", "Грузия": "Вайоминг", "Гавайи": "Вайоминг", .....}
Здесь у вас есть ненужный цикл - например, слово в состояниях означает для каждого из 50 состояний в вашем списке состояний, пройти через индекс 50 и присвоить значение имени этого состояния с помощью state [i], а затем немедленно перезаписать его с сокращением [ я]






Можешь попробовать:
state_to_abbrev = {}
for word in states:
for i in range(50):
state_to_abbrev[states[i]] = abbreviations[i]
state_to_abbrev
Как предлагается в комментарии, вам не нужен дополнительный цикл за словом, вы можете просто попробовать:
state_to_abbrev = {}
for i in range(50):
state_to_abbrev[states[i]] = abbreviations[i]
state_to_abbrev
Затем, используя dict comprehension, вы можете назначить в одной строке для указанного выше цикла:
state_to_abbrev = {states[i]:abbreviations[i] for i in range(50)}
Кроме того, поскольку вы используете два списка, вы можете попробовать использовать zip, вы также можете посмотреть, например, в документация:
dict(zip(states,abbreviations))
... почему вложенный цикл?
У вас есть дополнительный цикл, такой как OP, см. Мой комментарий
Упс, только что попробовал поправить код, отредактирую спасибо!
Я думаю, что метод zip - лучший ответ в целом
Попробуйте enumerate
state_to_abbrev = {}
for i, word in enumerate(states):
state_to_abbrev[word] = abbreviations[i]
state_to_abbrev
Наивный способ сделать то, что вы пытаетесь сделать, заключается в следующем:
state_to_abbrev = {}
for i in range(len(states)):
state_to_abbrev[states[i]] = abbreviations[i]
Вместо этого у вас есть вложенный цикл, но это не то, что вы хотите, вложенный цикл перебирает декартово произведение ваших двух списков, то есть:
In [46]: for a in ('a','b'):
...: for n in (1, 2):
...: print(a, n)
...:
a 1
a 2
b 1
b 2
In [47]:
Но на самом деле в Python вместо использования индексов вы бы использовали zip для параллельного перебора двух списков:
state_to_abbrev = {}
for st, abbr in zip(states, abbreviations):
state_to_abbrev[st] = abbr
Но В самом деле, вы должны знать, что конструктор dict уже принимает итерацию пар ключ-значение, поэтому вам нужно В самом деле:
state_to_abbrev = dict(zip(states, abbreviations))
Вот однострочная версия: (Python 3)
state_to_abbrev = dict(zip(states,abbreviations))
print(state_to_abbrev)
Распечатывает:
{'Alabama': 'AK', 'Alaska': 'AL', ...}
Вы можете попробовать любой из этих методов:
states=['Alabama','Arizona']
abbreviations=['AK','AL']
print(dict([i for i in zip(states,abbreviations)]))
print({i[0]:i[1] for i in zip(states,abbreviations)})
выход:
{'Alabama': 'AK', 'Arizona': 'AL'}
{'Alabama': 'AK', 'Arizona': 'AL'}
Похоже на относительно простой доступ к массиву. Убедитесь, что содержимое
abbreviationsсоответствует вашим ожиданиям.