Страницы

Поиск по вопросам

воскресенье, 5 января 2020 г.

Dictionary comprehensions синтаксис python

#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: -------------------------> ^^^^^^^^

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

Отправить комментарий