我似乎无法找到一种优雅的方式从t开始并导致s.
>>>t = ['a',2,'b',3,'c',4]
#magic
>>>print s
{'a': 2, 'c': 4, 'b': 3}
我提出的解决方案看起来不那么优雅:
s = dict()
for i in xrange(0, len(t),2): s[t[i]]=t[i+1]
# or something fancy with slices that I haven't figured out yet
它显然很容易解决,但是,似乎还有更好的方法.在那儿?
解决方法:
我会使用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),当然,这是输入列表和输出字典所需的).
docs中建议的方法(每个人都应该熟悉那个页面,itertool配方)是该页面上的成对函数,这基本上是我在这里建议的第二个.我认为每个site-packages目录都应该包含一个带有这些配方的iterutils.py文件(可惜这样的文件不是python的stdlib的一部分! – ).