2014-10-28 2 views

ответ

5

Если L - ваш первоначальный список, вы можете использовать zip(*[iter(L)]*2), чтобы группировать предметы в парах. dict constructor может занять Iterable таких пар непосредственно

>>> L = ['name1', 'value1', 'name2', 'value2', 'name3', 'value3'] 
>>> dict(zip(*[iter(L)]*2)) 
{'name1': 'value1', 'name2': 'value2', 'name3': 'value3'} 

Я не уверен, что вы имеете в виду проще (проще понять?). Трудно догадаться, что вы думаете, что это проще, поскольку я не знаю, на каком уровне вы находитесь. Вот путь без использования iter или zip. Если вы не знаете, что делает enumerate, вы должны посмотреть его.

>>> d = {} 
>>> for i, item in enumerate(L): 
...  if i % 2 == 0: 
...   key = item 
...  else: 
...   d[key] = item 
... 
>>> d 
{'name1': 'value1', 'name2': 'value2', 'name3': 'value3'} 
+0

Спасибо. Было бы немного проще, если бы было известно, сколько пар ключей/значений было? –

+0

@JoshuaGilman, Знать длину на самом деле не помогает. Я добавил еще один (длинный) путь к моему ответу. Это то, что вы имеете в виду? –

+0

Разве это не зависит от внутренней реализации zip? i.e, что он пытается прочитать один элемент за раз от каждого итератора вместо того, чтобы получать первый и второй список с нетерпением? – Maxaon3000

0

Вы можете попробовать это

>>> a = ['a', 'b', 'c', 'd', 'e', 'f'] 
>>> dict(zip([x for x in a[::2]], [x for x in a[1::2]])) 
{'a': 'b', 'c': 'd', 'e': 'f'} 

a[::2] получит весь второй элемент из начала списка из 0th элемента.

a[1::2] получит весь второй элемент из списка начиная с 1st элемент.

1

Не отвлекать никого. Я думаю, что это могло бы быть немного проще понять:

dict (zip (L[::2] , L[1::2])) 

Хотя это менее эффективно для большого списка, чем ответ gnibbler в.

1

Вам нужна функция для группировки последовательности в куски фиксированной длины. К сожалению, этого не хватает из ядра Python. Вы можете использовать partition из библиотеки funcy. (Примечание стороны: на других языках это называется chunksOf или grouped).

itertools документация предлагает эту функцию:

from itertools import zip_longest 

def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return zip_longest(*args, fillvalue=fillvalue) 

И документация zip предлагает другой способ сделать то же самое (данное в gnibbler's answer):

def grouper(iterable, n): 
    return zip(*[iter(iterable)]*n) 

После того, что доступно, остальные работы тривиальны.

>>> dict(grouper(range(8), 2)) 
{0: 1, 2: 3, 4: 5, 6: 7} 
Смежные вопросы