#python #словари #dict #syntax
Допустим, у меня появилось 2 списка, в одном лежат ключи, в другом их значения. Соответствие поиндексное (1:1,2:2) keys = [] values = [] Мне при помощи генератора словарей нужно создать словарь, ключом которого является keys[i], а значением values[i]. Подскажите правильный синтаксис этого действия, всё, что пока получилось: {k:v for k in keys for v in values} Oднако, данный синтаксис создаёт вложенный список и проходит по нему полностью. Mогу ли я как-то осуществить синхронный забор данных из списков?
Ответы
Ответ 1
В том случае если число элементов в keys и values совпадает можно воспользоваться встроенной функцией zip(): In [1]: keys = list("abcd") In [2]: values = [11,12,13,14] dictionary comprehension: In [3]: d = {k:v for k,v in zip(keys, values)} In [4]: d Out[4]: {'a': 11, 'b': 12, 'c': 13, 'd': 14} dict() конструктор: In [5]: d2 = dict(zip(keys, values)) In [6]: d2 Out[6]: {'a': 11, 'b': 12, 'c': 13, 'd': 14} если число элементов не совпадает, то не все элементы попадут в итоговый словарь: In [14]: values = [11, 12, 13] In [15]: keys Out[15]: ['a', 'b', 'c', 'd'] In [16]: values Out[16]: [11, 12, 13] In [17]: d3 = dict(zip(keys, values)) In [18]: d3 Out[18]: {'a': 11, 'b': 12, 'c': 13} ключ d не попал в словарь In [19]: d4 = {k:v for k,v in zip(keys, values)} In [20]: d4 Out[20]: {'a': 11, 'b': 12, 'c': 13} если в результирующем словаре должны быть все элементы, то можно воспользоваться itertools.zip_longest(): In [21]: from itertools import zip_longest In [22]: d5 = dict(zip_longest(keys, values)) In [23]: d5 Out[23]: {'a': 11, 'b': 12, 'c': 13, 'd': None} # NOTE: -------------------------> ^^^^^^^^
Комментариев нет:
Отправить комментарий