Преобразование двух списков в словарь в Python

Представьте, что у вас есть:

keys = ['name', 'age', 'food']
values = ['Monty', 42, 'spam']

Каков самый простой способ создать следующий словарь?

a_dict = {'name' : 'Monty', 'age' : 42, 'food' : 'spam'}
875
16 окт. '08 в 22:05
источник поделиться
14 ответов

Как это:

>>> keys = ['a', 'b', 'c']
>>> values = [1, 2, 3]
>>> dictionary = dict(zip(keys, values))
>>> print(dictionary)
{'a': 1, 'b': 2, 'c': 3}

Voila :-) dict конструктора и zip функции чрезвычайно полезны: https://docs.python.org/3/library/functions.html#func-dict

1585
16 окт. '08 в 22:09
источник

Связанные вопросы


Похожие вопросы

Попробуйте следующее:

>>> import itertools
>>> keys = ('name', 'age', 'food')
>>> values = ('Monty', 42, 'spam')
>>> adict = dict(itertools.izip(keys,values))
>>> adict
{'food': 'spam', 'age': 42, 'name': 'Monty'}

В Python 2 он также более экономичен в потреблении памяти по сравнению с zip.

115
16 окт. '08 в 22:16
источник

Представьте, что у вас есть:

keys = ('name', 'age', 'food')
values = ('Monty', 42, 'spam')

Каков самый простой способ создать следующий словарь?

dict = {'name' : 'Monty', 'age' : 42, 'food' : 'spam'}

Большинство исполнителей - Python 2.7 и 3, понимание dict:

Возможным улучшением использования конструктора dict является использование собственного синтаксиса понимания dict (не понимание списка, как это ошибочно считают другие):

new_dict = {k: v for k, v in zip(keys, values)}

В Python 2, zip возвращает список, чтобы избежать создания ненужного списка, используйте izip вместо этого (aliased to zip может уменьшить изменения кода при переходе на Python 3).

from itertools import izip as zip

Итак, это все еще:

new_dict = {k: v for k, v in zip(keys, values)}

Python 2, идеально подходит для <= 2.6

izip from itertools становится zip в Python 3. izip лучше, чем zip для Python 2 (потому что он избегает ненужного создания списка) и идеален для 2.6 или ниже:

from itertools import izip
new_dict = dict(izip(keys, values))

Python 3

В Python 3, zip становится той же функцией, что и в модуле itertools, так что это просто:

new_dict = dict(zip(keys, values))

Понимание понятий было бы более эффективным (см. обзор производительности в конце этого ответа).

Результат для всех случаев:

Во всех случаях:

>>> new_dict
{'age': 42, 'name': 'Monty', 'food': 'spam'}

Объяснение:

Если мы посмотрим на help на dict, мы увидим, что он принимает множество форм аргументов:

>>> help(dict)

class dict(object)
 |  dict() -> new empty dictionary
 |  dict(mapping) -> new dictionary initialized from a mapping object's
 |      (key, value) pairs
 |  dict(iterable) -> new dictionary initialized as if via:
 |      d = {}
 |      for k, v in iterable:
 |          d[k] = v
 |  dict(**kwargs) -> new dictionary initialized with the name=value pairs
 |      in the keyword argument list.  For example:  dict(one=1, two=2)

Оптимальным подходом является использование итерации, избегая при этом создания ненужных структур данных. В Python 2 zip создает ненужный список:

>>> zip(keys, values)
[('name', 'Monty'), ('age', 42), ('food', 'spam')]

В Python 3 эквивалент будет:

>>> list(zip(keys, values))
[('name', 'Monty'), ('age', 42), ('food', 'spam')]

и Python 3 zip просто создает итерируемый объект:

>>> zip(keys, values)
<zip object at 0x7f0e2ad029c8>

Поскольку мы хотим избежать создания ненужных структур данных, мы обычно хотим избежать Python 2 zip (поскольку он создает ненужный список).

Менее эффективные альтернативы:

Это выражение генератора передается конструктору dict:

generator_expression = ((k, v) for k, v in zip(keys, values))
dict(generator_expression)

или эквивалентно:

dict((k, v) for k, v in zip(keys, values))

И это понимание списка передается конструктору dict:

dict([(k, v) for k, v in zip(keys, values)])

В первых двух случаях лишний слой неоперативного (следовательно, ненужного) вычисления помещается поверх zip-итерации, а в случае понимания списка лишний список излишне создается. Я ожидал бы, что все они будут менее результативными, и, конечно же, не более того.

Обзор производительности:

В 64-битном Python 3.4.3, на Ubuntu 14.04, упорядочен от самого быстрого до самого медленного:

>>> min(timeit.repeat(lambda: {k: v for k, v in zip(keys, values)}))
0.7836067057214677
>>> min(timeit.repeat(lambda: dict(zip(keys, values))))
1.0321204089559615
>>> min(timeit.repeat(lambda: {keys[i]: values[i] for i in range(len(keys))}))
1.0714934510178864
>>> min(timeit.repeat(lambda: dict([(k, v) for k, v in zip(keys, values)])))
1.6110592018812895
>>> min(timeit.repeat(lambda: dict((k, v) for k, v in zip(keys, values))))
1.7361853648908436
100
16 нояб. '15 в 16:54
источник
>>> keys = ('name', 'age', 'food')
>>> values = ('Monty', 42, 'spam')
>>> dict(zip(keys, values))
{'food': 'spam', 'age': 42, 'name': 'Monty'}
30
16 окт. '08 в 22:09
источник

Вы также можете использовать словарь в Python ≥ 2.7:

>>> keys = ('name', 'age', 'food')
>>> values = ('Monty', 42, 'spam')
>>> {k: v for k, v in zip(keys, values)}
{'food': 'spam', 'age': 42, 'name': 'Monty'}
26
10 июня '12 в 23:03
источник

Если вам нужно преобразовать ключи или значения перед созданием словаря, можно использовать выражение . Пример:

>>> adict = dict((str(k), v) for k, v in zip(['a', 1, 'b'], [2, 'c', 3])) 

Посмотрите Код Как Pythonista: Идиоматический Python.

13
16 окт. '08 в 23:45
источник

Более естественным способом является использование понимания словаря

keys = ('name', 'age', 'food')
values = ('Monty', 42, 'spam')    
dict = {keys[i]: values[i] for i in range(len(keys))}
11
16 нояб. '15 в 8:03
источник

с Python 3.x, идет для понимания dict

keys = ('name', 'age', 'food')
values = ('Monty', 42, 'spam')

dic = {k:v for k,v in zip(keys, values)}

print(dic)

Подробнее о диктовках здесь, есть пример:

>>> print {i : chr(65+i) for i in range(4)}
    {0 : 'A', 1 : 'B', 2 : 'C', 3 : 'D'}
9
25 мая '13 в 16:47
источник

Для тех, кому нужен простой код и arent, знакомый с zip:

List1 = ['This', 'is', 'a', 'list']
List2 = ['Put', 'this', 'into', 'dictionary']

Это может быть сделано одной строкой кода:

d = {List1[n]: List2[n] for n in range(len(List1))}
5
29 марта '13 в 22:13
источник
  • 2018-04-18

Лучшее решение по-прежнему:

In [92]: keys = ('name', 'age', 'food')
...: values = ('Monty', 42, 'spam')
...: 

In [93]: dt = dict(zip(keys, values))
In [94]: dt
Out[94]: {'age': 42, 'food': 'spam', 'name': 'Monty'}

Измените это:

    lst = [('name', 'Monty'), ('age', 42), ('food', 'spam')]
    keys, values = zip(*lst)
    In [101]: keys
    Out[101]: ('name', 'age', 'food')
    In [102]: values
    Out[102]: ('Monty', 42, 'spam')
2
18 апр. '18 в 5:41
источник

Вы можете сделать это одной строкой, используя словарь:

a_dict={key:value for key,value in zip(keys,values)}

и это все. Наслаждайтесь Python.....;)

1
21 нояб. '18 в 2:57
источник

вы можете использовать этот ниже код:

dict(zip(['name', 'age', 'food'], ['Monty', 42, 'spam']))

Но убедитесь, что длина списков будет одинаковой. Если длина не одинакова, то zip-функция завершает работу более длинным.

1
16 нояб. '17 в 16:36
источник

метод без функции почтового индекса

l1 = [1,2,3,4,5]
l2 = ['a','b','c','d','e']
d1 = {}
for l1_ in l1:
    for l2_ in l2:
        d1[l1_] = l2_
        l2.remove(l2_)
        break  

print (d1)


{1: 'd', 2: 'b', 3: 'e', 4: 'a', 5: 'c'}
0
24 мая '17 в 8:47
источник
>>> labels = ["Sessions", "Absences", "Excused"]
>>> label_values = [1,0,3]
>>> dictionary = dict(zip(labels,label_values))
>>> print dictionary
    {'Absences': 0, 'Excused': 3, 'Sessions': 1}
0
06 февр. '19 в 8:40
источник

Посмотрите другие вопросы по меткам или Задайте вопрос