Допустим, у меня есть список a
в Python, чьи записи удобно отображаются в словарь. Каждый четный элемент представляет ключ к словарю, а следующий нечетный элемент является значением
например,
a = ['hello','world','1','2']
и я хотел бы преобразовать его в словарь b
, где
b['hello'] = 'world'
b['1'] = '2'
Какой синтаксически самый чистый способ сделать это?
python
list
dictionary
Майк
источник
источник
Ответы:
Если
a
оно велико, вы, вероятно, захотите сделать что-то вроде следующего, которое не создает никаких временных списков, как указано выше.В Python 3 вы также можете использовать интеллектуальное понимание, но по иронии судьбы я думаю, что самый простой способ сделать это будет с
range()
иlen()
, который обычно был бы запахом кода.Таким образом, этот
iter()/izip()
метод все еще, вероятно, самый Pythonic в Python 3, хотя, как отмечает EOL в комментарии,zip()
он уже ленив в Python 3, поэтому вам не нужноizip()
.Если вы хотите, чтобы это было в одной строке, вам придется обманывать и использовать точку с запятой. ;-)
источник
zip(i, i)
в Python 3, так какzip()
теперь возвращает итератор.Простой ответ
Другой вариант (любезно предоставлен Алексом Мартелли - источник ):
Связанное примечание
Если у вас есть это:
и вы хотите это (каждый элемент списка набирает определенное значение (в данном случае 2)):
ты можешь использовать:
источник
fromkeys
.>>> dict.fromkeys(a, 2) {'bi': 2, 'double': 2, 'duo': 2, 'two': 2}
Вы можете использовать для этого очень легко:
Это эквивалентно циклу for ниже:
источник
Что-то, что я нахожу довольно крутым, это то, что если ваш список состоит всего из 2 пунктов:
Помните, dict принимает любую итерацию, содержащую итерацию, где каждый элемент в итерации должен сам быть итерируемым с ровно двумя объектами.
источник
Может быть, не самый питонический, но
источник
enumerate
for i, key in enumerate(a[::2]):
. Все еще не в духе, так как конструктор dict может сделать большую часть работы здесь для васfor i, key in enumerate(a[::2]):
подход может работать? Результирующие значения пары были бы0 hello
и1 1
, и мне неясно, как их использовать для получения{'hello':'world', '1':'2'}
.enumerate(a)[::2]
Вы можете сделать это довольно быстро без создания дополнительных массивов, так что это будет работать даже для очень больших массивов:
Если у вас есть генератор
a
, даже лучше:Вот краткое изложение:
источник
{'hello':'hello','world':'world','1':'1','2':'2'}
)Вы также можете сделать это следующим образом (преобразование строки в список здесь, затем преобразование в словарь)
источник
Мне также очень интересно иметь однострочник для этого преобразования, поскольку такой список является инициализатором хэширования в Perl по умолчанию.
Исключительно полный ответ дан в этой теме -
Мой, я новичок в Python), используя выражения генератора Python 2.7 , будет:
dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))
источник
Я не уверен, что это питон, но, кажется, работает
источник
попробуйте код ниже:
источник
Вы также можете попробовать этот подход сохранить ключи и значения в другом списке, а затем использовать метод dict
вывод:
источник
источник