Конвертировать два списка в словарь в Python

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

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

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

a_dict = {'name' : 'Monty', 'age' : 42, 'food' : 'spam'}
вопрос задан 16.10.2008
Guido García
24124 репутация

12 ответов


  • 1444 рейтинг

    Как это:

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

    Вуаля :-) Парный конструктор dict и функция zip очень полезны: https: // docs. питон. орг / 3 / библиотеки / функция. html # func-dict

    ответ дан Dan Lenski, с репутацией 46521, 16.10.2008
  • 110 рейтинг

    Попробуйте это:

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

    ответ дан Mike Davis, с репутацией 1163, 16.10.2008
  • 89 рейтинг

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

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

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

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

    Самый производительный - Python 2. 7 и 3, понимание слова:

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

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

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

    from itertools import izip as zip
    

    Так что еще:

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

    Python 2, идеально подходит для & lt; = 2. 6

    izip из 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'}
    

    Объяснение:

    Если мы посмотрим на справку по 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 в Python 2 (так как он создает ненужный список).

    Менее производительные альтернативы:

    Это выражение генератора, передаваемое конструктору 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
    
    ответ дан Aaron Hall, с репутацией 153756, 16.11.2015
  • 29 рейтинг
    >>> keys = ('name', 'age', 'food')
    >>> values = ('Monty', 42, 'spam')
    >>> dict(zip(keys, values))
    {'food': 'spam', 'age': 42, 'name': 'Monty'}
    
    ответ дан iny, с репутацией 5321, 16.10.2008
  • 26 рейтинг

    Вы также можете использовать словарь в 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'}
    
    ответ дан Brendan Berg, с репутацией 1700, 10.06.2012
  • 13 рейтинг

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

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

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

    ответ дан jfs, с репутацией 252362, 16.10.2008
  • 9 рейтинг

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

    keys = ('name', 'age', 'food')
    values = ('Monty', 42, 'spam')    
    dict = {keys[i]: values[i] for i in range(len(keys))}
    
    ответ дан Polla A. Fattah, с репутацией 369, 16.11.2015
  • 9 рейтинг

    с Python 3. х, идет на взыскания

    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'}
    
    ответ дан octoback, с репутацией 13234, 25.05.2013
  • 5 рейтинг

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

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

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

    d = {List1[n]: List2[n] for n in range(len(List1))}
    
    ответ дан exploitprotocol, с репутацией 59, 29.03.2013
  • 2 рейтинг
    • 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'}
    

    Tranpose это:

        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')
    
    ответ дан JawSaw, с репутацией 3060, 18.04.2018
  • 1 рейтинг

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

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

    Но убедитесь, что длина списков будет одинаковой. если длина не одинакова. тогда функция почтового индекса сокращает более длинную.

    ответ дан Akash Nayak, с репутацией 307, 16.11.2017
  • 0 рейтинг

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

    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'}
    
    ответ дан xiyurui, с репутацией 101, 24.05.2017