python地将python中的单个有序列表转换为字典

我似乎无法找到一种优雅的方式从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的一部分! – ).

上一篇:Python-所有组合,包括方括号


下一篇:python – 为什么itertools.groupby()不起作用?