Преобразовать список в словарь в Python - PullRequest
165 голосов
/ 02 января 2011

Допустим, у меня есть список a в Python, чьи записи удобно отображаются в словарь.Каждый четный элемент представляет ключ к словарю, а следующим нечетным элементом является значение

, например,

a = ['hello','world','1','2']

, и я хотел бы преобразовать его в словарь b, где

b['hello'] = 'world'
b['1'] = '2'

Каков синтаксически наиболее чистый способ сделать это?

Ответы [ 13 ]

247 голосов
/ 02 января 2011
b = dict(zip(a[::2], a[1::2]))

Если a большое, вы, вероятно, захотите сделать что-то вроде следующего, которое не создает никаких временных списков, как указано выше.

from itertools import izip
i = iter(a)
b = dict(izip(i, i))

В Python 3 вы также можете использовать dict-понимание, но по иронии судьбы я думаю, что самый простой способ сделать это будет с range() и len(), что обычно будет запахом кода.

b = {a[i]: a[i+1] for i in range(0, len(a), 2)}

Таким образом, метод iter()/izip() по-прежнему, вероятно, самый Pythonic в Python 3, хотя, как отмечает EOL в комментарии, zip() уже ленив в Python 3, поэтому вам не нужен izip().

i = iter(a)
b = dict(zip(i, i))

Если вы хотите, чтобы это было в одной строке, вам придется обманывать и использовать точку с запятой. ; -)

45 голосов
/ 27 октября 2012

Простой ответ

Другой вариант (любезно предоставлено Алексом Мартелли https://stackoverflow.com/a/2597178/104264):

dict(x[i:i+2] for i in range(0, len(x), 2))


Примечание по теме

Если у вас есть это:

a = ['bi','double','duo','two']

и вы хотите это (каждый элемент списка набирает определенное значение (в данном случае 2)):

{'bi':2,'double':2,'duo':2,'two':2}

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

>>> dict((k,2) for k in a)
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2}
15 голосов
/ 17 января 2014

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

a = ['hello','world','1','2']

my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0}

Это эквивалентно циклу for ниже:

my_dict = {}
for index, item in enumerate(a):
    if index % 2 == 0:
        my_dict[item] = a[index+1]
10 голосов
/ 13 ноября 2014

Что-то, что я нахожу довольно классным, это то, что если ваш список состоит всего из 2 элементов:

ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}

Помните, dict принимает любую итерацию, содержащую итерацию, где каждый элемент в итерации должен сам быть итеративнымровно с двумя объектами.

4 голосов
/ 25 февраля 2016

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

dict(izip(*([iter(a)]*2)))

Если у вас есть генератор a, еще лучше:

dict(izip(*([a]*2)))

Вот краткое изложение:

iter(h)    #create an iterator from the array, no copies here
[]*2       #creates an array with two copies of the same iterator, the trick
izip(*())  #consumes the two iterators creating a tuple
dict()     #puts the tuples into key,value of the dictionary
4 голосов
/ 02 января 2011

Может быть не самый питонический, но

>>> b = {}
>>> for i in range(0, len(a), 2):
        b[a[i]] = a[i+1]
1 голос
/ 04 июля 2014

Мне также очень интересно иметь однострочник для этого преобразования, поскольку такой список является инициализатором по умолчанию для хэширования в Perl.

В этой теме дается исключительно исчерпывающий ответ -

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

dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))

1 голос
/ 16 апреля 2014

Вы также можете сделать это следующим образом (преобразование строки в список здесь, затем преобразование в словарь)

    string_list = """
    Hello World
    Goodbye Night
    Great Day
    Final Sunset
    """.split()

    string_list = dict(zip(string_list[::2],string_list[1::2]))

    print string_list
0 голосов
/ 16 января 2019
{x: a[a.index(x)+1] for x in a if a.index(x) % 2 ==0}

result : {'hello': 'world', '1': '2'}
0 голосов
/ 15 апреля 2018

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

data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']

keys=[]
values=[]
for i,j in enumerate(data):
    if i%2==0:
        keys.append(j)
    else:
        values.append(j)

print(dict(zip(keys,values)))

выход:

{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...