Как правильно создать словарь из двух списков с помощью itertools?
Есть два списка разной длины. В первом содержатся ключи, а во втором значения. Напишите функцию, которая создает из этих ключей и значений словарь. Если ключу не хватило значения, в словаре должно быть значение None. Значения, которым не хватило ключей, нужно игнорировать.
- Вопрос задан более трёх лет назад
- 1451 просмотр
1 комментарий
Оценить 1 комментарий
Как сделать словарь из двух списков?
Итак , у меня есть два списка uniq и fifa(по длине одинаковы). Мне нужно , чтобы каждому элементу списка uniq был наследован каждый элемент списка uniq. p.s. к глубочайшему сожалению , я не могу придумать , как сделать данную конструкцию без костылей
Отслеживать
149k 12 12 золотых знаков 59 59 серебряных знаков 133 133 бронзовых знака
задан 24 фев 2018 в 12:45
Sahar Vkusni Sahar Vkusni
485 2 2 золотых знака 8 8 серебряных знаков 26 26 бронзовых знаков
Вы хотите чтобы каждому значению из списка uniq соответствовало значение из списка fifa?
24 фев 2018 в 13:23
да (я пишу этот текст в скобочках , чтобы обойти правила в стаке)
24 фев 2018 в 13:25
какое отношение pandas к вопросу имеет?
26 фев 2018 в 10:46
дал понять людям , что манипуляции с данным либом тут актуальны и могут быть использованы мной в коде
26 фев 2018 в 12:13
Чтобы подробнее разобраться в этой теме, рекомендую обратиться к этой статье. Здесь всё поэтапно написано и про другие темы в сфере программирования. sibsisadmin.ru/kak-sdelat-slovar-iz-dvuh-spiskov-v-python
27 сен 2021 в 12:47
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
uniq = [1,2,3,4,5] fifa = ['a','b','c','d','e'] uniq_and_fifa = dict(zip(uniq, fifa))
Отслеживать
ответ дан 24 фев 2018 в 13:26
627 5 5 серебряных знаков 17 17 бронзовых знаков
спасибо , я думал , что zip перемножает
24 фев 2018 в 13:29
Zip склеивает объекты на каждой итерации, в результате чего получается zip-объект, который можно переобразить в какой-то массив с помощью соответсвующих методов dict, list и так далее.
24 фев 2018 в 13:42
@SaharVkusni: zip от слова zipper (застёжка-молния) — сшивает половинки: первый элемент это объединение первых элементов аргументов: print(*next(zip(‘abc’, ‘ABC’))) -> a A
26 фев 2018 в 10:45
Судя по описанию задачи и метке Pandas вам нужен Pandas.Series:
In [48]: uniq = np.arange(1, 11) In [49]: fifa = np.random.choice(list('abcdefgh'), 10) In [50]: s = pd.Series(fifa, index=uniq) In [51]: s Out[51]: 1 b 2 c 3 b 4 d 5 f 6 e 7 a 8 a 9 c 10 h dtype: object
Отслеживать
ответ дан 24 фев 2018 в 15:38
MaxU — stand with Ukraine MaxU — stand with Ukraine
149k 12 12 золотых знаков 59 59 серебряных знаков 133 133 бронзовых знака
Для того, чтобы из двух списков сделать словарь, надо перебрать в цикле все индексы любого из списков (ведь длина списков одинакова):
for i in range(0, len(uniq)): #тело цикла
Теперь в теле цикла можно обратиться к элементам с одинаковыми индексами: uniq[i] и fifa[i] — это ключ и значение элемента словаря, который нужно создать. Создать новый элемент словаря можно так: uniq_and_fifa[ключ] = значение . Объявляем пустой словарь и дописываем цикл for :
uniq_and_fifa = <> for i in range(0, len(uniq)): uniq_and_fifa[uniq[i]] = fifa[i]
Создание словаря из отдельных списков ключей и значений в Python

В работе с Python очень часто возникает потребность в создании словаря из отдельных списков ключей и значений. Возьмем для примера два списка: один со списком стран, а другой — с их столицами.
countries = ['Россия', 'США', 'Франция'] capitals = ['Москва', 'Вашингтон', 'Париж']
Задача — создать словарь, где страны будут ключами, а столицы — соответствующими значениями.
Для решения этой задачи в Python существует несколько подходов.
Использование функции zip()
Один из наиболее простых и эффективных способов — использование встроенной функции zip() , которая возвращает итератор кортежей, где первый элемент в каждом происходит из первого передаваемого аргумента, второй — из второго и так далее. Затем итератор можно преобразовать в словарь с помощью функции dict() .
countries = ['Россия', 'США', 'Франция'] capitals = ['Москва', 'Вашингтон', 'Париж'] dictionary = dict(zip(countries, capitals))
В результате получаем требуемый словарь:
Использование цикла for
Другой подход — использование цикла for . В этом случае сначала создается пустой словарь, а затем в цикле для каждого ключа из списка ключей в словарь добавляется соответствующее значение из списка значений.
countries = ['Россия', 'США', 'Франция'] capitals = ['Москва', 'Вашингтон', 'Париж'] dictionary = <> for i in range(len(countries)): dictionary[countries[i]] = capitals[i]
В результате также получаем требуемый словарь:
Выбор подхода зависит от конкретной задачи и предпочтений программиста. Оба метода позволяют быстро и просто решить поставленную задачу.
Как из двух списков сделать словарь python
На этом шаге мы рассмотрим различные способы задания словаря .
с помощью функции dict() . Форматы функции:
dict(Ключ1>=Значение1>[, . КлючN>=ЗначениеN>]) dict(Словарь>) dict(Список кортежей с двумя элементами (Ключ, Значение)>) dict(Список списков с двумя элементами [Ключ, Значение]>)
Если параметры не указаны, то создается пустой словарь. Примеры:
>>> d = dict(); d # Создаем пустой словарь <> >>> d = dict(a=1, b=2); d >>> d = dict(«a»: 1, «b»: 2>); d # Словарь >>> d = dict([(«a», 1), («b», 2)]); d # Список кортежей >>> d = dict([[«a», 1], [«b», 2]]); d # Список списков
Объединить два списка в список кортежей позволяет функция zip () :
>>> k = [«a», «b»] # Список с ключами >>> v = [1, 2] # Список со значениями >>> list(zip(k, v)) # Создание списка кортежей [(‘a’, 1), (‘b’, 2)] >>> d = dict(zip(k, v)); d # Создание словаря
>>> d = dict(); d # Создание пустого словаря <> >>> d = «a»: 1, «b»: 2>; d
>>> d = <> # Создаем пустой словарь >>> d[«a»] = 1 # Добавляем элемент 1 (ключ «a») >>> d[«b»] = 2 # Добавляем злемент 2 (ключ «b») >>> d
>>> d = dict.fromkeys([«a», «b», «c»]) >>> d >>> d = dict.fromkeys([«a», «b», «c»], 0) # Указан список >>> d >>> d = dict.fromkeys((«a», «b», «c»), 0) # Указан кортеж >>> d
При создании словаря в переменной сохраняется ссылка на объект, а не сам объект. Это обязательно следует учитывать при групповом присваивании. Групповое присваивание можно использовать для чисел и строк, но для списков и словарей этого делать нельзя. Рассмотрим пример:
>>> d1 = d2 = "a": 1, "b": 2> # Якобы создали два объекта >>> d2["b"] = 10 >>> d1, d2 # Изменилось значение в двух переменных. (, )
Как видно из примера, изменение значения в переменной d2 привело также к изменению значения в переменной d1 . To есть, обе переменные ссылаются на один и тот же объект, а не на два разных объекта. Чтобы получить два объекта, необходимо производить раздельное присваивание:
>>> d1, d2 = "a": 1, "b": 2>, "a": 1, "b": 2> >>> d2["b"] = 10 >>> d1, d2 (, )
Создать поверхностную копию словаря позволяет функция diсt() :
>>> d1 = "a": 1, "b": 2> # Создаем словарь >>> d2 = dict(d1) # Создаем поверхностную копию >>> d1 is d2 # Оператор показывает, что это разные объекты False >>> d2 ["b"] = 10 >>> d1, d2 # Изменилось только значение в переменной d2 (, )
Кроме того, для создания поверхностной копии можно воспользоваться методом сору() :
>>> d1 = "a": 1, "b": 2> # Создаем словарь >>> d2 = d1.copy() # Создаем поверхностную копию >>> d1 is d2 # Оператор показывает, что это разные объекты False >>> d2 ["b"] = 10 >>> d1, d2 # Изменилось только значение в переменной d2 (, )
Чтобы создать полную копию словаря, следует воспользоваться функцией deepcopy() из модуля copy :
>>> d1 = "a": 1, "b": [20, 30, 40] > >>> d2 = dict(d1) # Создаем поверхностную копию >>> d2["b"][0] = "test" >>> d1, d2 # Изменились значения в двух переменных. (, ) >>> import copy >>> d3 = copy.deepcopy(d1) # Создаем полную копию >>> d3["b"][1] = 800 >>> d1, d3 # Изменилось значение только в переменной d3 (, )
На следующем шаге мы рассмотрим операции над словарями .