Преобразование списка в словарь на Python
допустим, у меня есть список a
в Python, записи которого удобно сопоставляются со словарем. Каждый четный элемент представляет ключ к словарю, а следующий нечетный элемент-значение
например,
a = ['hello','world','1','2']
и я хотел бы преобразовать его в словарь b
, где
b['hello'] = 'world'
b['1'] = '2'
каков синтаксически самый чистый способ сделать это?
13 ответов
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))
если вы хотите его на одной строке, вам придется обмануть и использовать точку с запятой. ;-)
простой ответ
другой вариант (любезно Алекс Мартелли 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}
вы можете использовать понимание 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]
что-то я нахожу довольно крутым, а именно, если ваш список состоит только из 2 элементов:
ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}
помните, дикт принимает любое повторяемое, содержащий массиве, где каждый элемент в массиве должен быть итерируемым с двумя объектами.
не может быть наиболее подходящие для Python, но
>>> b = {}
>>> for i in range(0, len(a), 2):
b[a[i]] = a[i+1]
вы можете сделать это довольно быстро без создания дополнительных массивов, поэтому это будет работать даже для очень больших массивов:
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
вы также можете сделать это так (преобразование строки в список здесь, а затем преобразование в словарь)
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
мне также очень интересно иметь однострочный для этого преобразования, поскольку такой список является инициализатором по умолчанию для хэширования в Perl.
исключительно полный ответ дается в этой теме -
мой один я новичок в Python), используя Выражения Генератора Python 2.7 будет:
dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))
Я не уверен, что это питон, но, кажется, работает
def alternate_list(a):
return a[::2], a[1::2]
key_list,value_list = alternate_list(a)
b = dict(zip(key_list,value_list))
попробовать ниже код:
>>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
>>> d2
{'three': 3, 'two': 2, 'one': 1}
вы также можете попробовать этот подход сохранить ключи и значения в другом списке, а затем использовать метод 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'}
у меня несколько похожая проблема, у меня есть список, который мне нужно принести какие-то значения, но я не могу использовать индексы, чтобы поступить так же, как список значений, не всегда в том же порядке, я хочу использовать поле "имя", чтобы получить значение то же, решения я думаю о том, чтобы преобразовать этот список в словарь, а потом используйте клавиши для получения определенного значения, но я не могу конвертировать мой список правильный словарь, Я использовал ниже один лайнер, чтобы сделать вам требуемую мощность, но не в состоянии получить что:
Мой Список:
List = ['abc=def', 'ghi=jkl', 'mno=1', 'pqr=']
используется ниже одного лайнера, чтобы преобразовать его в Dict:
Dict = dict(itertools.zip_longest(*[iter(List)] * 2, fillvalue=""))
словарь у меня есть:
Dict = {'abc=def': 'ghi=jkl', 'mno=1': 'pqr='}
словарь я хочу:
Dict_wanted = {'abc':'def','ghi': 'jkl','mno':'1','pqr':''}
пожалуйста, помогите!