Я бы использовал itertools
, но, если вы думаете, что это сложно (как вы намекали в комментарии), то возможно:
def twobytwo(t):
it = iter(t)
for x in it:
yield x, next(it)
d = dict(twobytwo(t))
или эквивалентно, и снова к itertools,
def twobytwo(t):
a, b = itertools.tee(iter(t))
next(b)
return itertools.izip(a, b)
d = dict(twobytwo(t))
или, если вы настаиваете на том, чтобы быть на линии, в подходящем для сезона настроении "трюк или угощение":
d = dict((x, next(it)) for it in (iter(t),) for x in it)
я, я считаю это уловкой, но некоторые могут посчитать это удовольствием. Итак, я нахожу такие вещи страшными, но, по-видимому, в США примерно в это время года вещи должны быть; -).
По сути, проблема сводится к тому, «как пройти список 2 элементов за раз», потому что dict
очень рад взять последовательность из 2 кортежей и превратить ее в словарь. Все решения, которые я здесь показываю, гарантируют, что только O(1)
будет использовано дополнительное пространство (за пределами пробела, очевидно, O(N)
, что, конечно, необходимо для списка ввода и вывода dict).
Предложенный подход в документах (все должны быть знакомы с этой страницей, рецепты itertool) - это функция pairwise
на этой странице, которая в основном является второй, которую я предложил здесь. Я думаю, что каждый каталог site-packages должен содержать файл iterutils.py
с этими рецептами (жаль, что этот файл уже не является частью stdlib python! -).