Допустим, у меня есть список 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 inrange(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)):
{'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 inenumerate(a) if index % 2 == 0}
Это эквивалентно циклу for , приведенному ниже:
my_dict = {} for index, item inenumerate(a): if index % 2 == 0: my_dict[item] = a[index+1]
Ответ 4
Что-то, что я нахожу довольно крутым, так это то, что если ваш список состоит всего из 2 элементов:
ls = ['a', 'b'] dict([ls]) >>> {'a':'b'}
Помните, dict принимает любой итерируемый файл, содержащий итерируемый файл, где каждый элемент в итерируемом файле сам по себе должен быть итерируемым с ровно двумя объектами.