Преобразование списка в словарь в Python

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

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

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

Ответ 2

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

Другой вариант (предоставлено Алексом Мартелли fooobar.com/questions/51957/...):

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

    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

Ответ 8

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

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

Mine one Я новичок в Python), используя Python 2.7 Generator Expressions, будет:

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

Ответ 9

Я не уверен, что это pythonic, но, похоже, работает

def alternate_list(a):
   return a[::2], a[1::2]

key_list,value_list = alternate_list(a)
b = dict(zip(key_list,value_list))

Ответ 10

попробуйте под кодом:

  >>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
  >>> d2
      {'three': 3, 'two': 2, 'one': 1}

Ответ 11

Вы также можете попробовать этот подход сохранить ключи и значения в другом списке, а затем использовать метод 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'}

Ответ 12

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

Мой список:

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':''}

Пожалуйста помоги!

Ответ 13

{x: a[a.index(x)+1] for x in a if a.index(x) % 2 ==0}

result : {'hello': 'world', '1': '2'}

Ответ 14

    import collections
    a=[1,2,3,4,4,5,6,7,3,4,5,6,1,1,1,3,3,5,7,7]
    d=collections.Counter(a)
    print(d)
    {1: 4, 3: 4, 4: 3, 5: 3, 7: 3, 6: 2, 2: 1}

Ответ 15

#work~
`
a = ['Openstack','Puppet','Python']
b = {}
c = 0
for v in a:
    b[v] = c
    c+=1
print b

`

Ответ 16

в python это очень просто:

dict(a)