Я хотел бы использовать 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)
меня, я считаю, это трюк, но некоторые могут найти это удовольствие. IOW, я нахожу такое страшное явление, но, видимо, в США в это время года есть , предположительно, чтобы быть ;-).
В основном проблема сводится к тому, «как мне вести список по 2 элемента за раз», потому что dict
вполне счастлив взять последовательность из 2-х кортежей и превратить их в словарь. Все решения, которые я показываю здесь, обеспечивают только O(1)
дополнительное пространство (за пределами пространства, очевидно O(N)
, это необходимо для ввода списка и выход dict, конечно).
Предлагаемый подход в docs (все должны быть знакомы с этой страницей, рецепты itertool) - это функция pairwise
на этой странице, которая в основном является второй, которую я предложил здесь. Я думаю, что каждый каталог сайтов-пакетов должен содержать файл iterutils.py
с этими рецептами (жаль, что такой файл уже не является частью stdlib!).
+1 для «трюк» и ваше замечание о 'iterutils.py'. – Stephan202