Присвоение значений словарю из списка

Я хочу создать словарь, в котором будут храниться полные названия 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', «Аляска»: «Вайоминг», "Аризона": "Вайоминг", "Арканзас": "Вайоминг", "Калифорния": "Вайоминг", "Колорадо": "Вайоминг", «Коннектикут»: «Вайоминг», "Делавэр": "Вайоминг", "Флорида": "Вайоминг", "Грузия": "Вайоминг", "Гавайи": "Вайоминг", .....}

Похоже на относительно простой доступ к массиву. Убедитесь, что содержимое abbreviations соответствует вашим ожиданиям.

sorak 12.03.2018 03:30

Здесь у вас есть ненужный цикл - например, слово в состояниях означает для каждого из 50 состояний в вашем списке состояний, пройти через индекс 50 и присвоить значение имени этого состояния с помощью state [i], а затем немедленно перезаписать его с сокращением [ я]

Lost 12.03.2018 03:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
78
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Можешь попробовать:

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

... почему вложенный цикл?

juanpa.arrivillaga 12.03.2018 03:34

У вас есть дополнительный цикл, такой как OP, см. Мой комментарий

Lost 12.03.2018 03:34

Упс, только что попробовал поправить код, отредактирую спасибо!

student 12.03.2018 03:36

Я думаю, что метод zip - лучший ответ в целом

Lost 12.03.2018 03:38

Попробуйте 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'}

Другие вопросы по теме