Вопрос-Ответ

Convert [key1,val1,key2,val2] to a dict?

Преобразовать [key1,val1,key2, val2] в dict?

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

например,

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

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

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

Какой синтаксически самый чистый способ добиться этого?

Переведено автоматически
Ответ 1
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() метод по-прежнему, вероятно, самый питонистский в Python 3, хотя, как отмечает EOL в комментарии, zip() уже ленив в Python 3, поэтому вам не нужен izip().

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

В Python 3.8 и более поздних версиях вы можете записать это в одной строке, используя оператор "walrus" (:=):

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

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

Ответ 2

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

Другой вариант (любезно предоставлен Алексом Мартелли - исходный код):

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}
Ответ 3

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

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]
Ответ 4

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

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

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

python list dictionary