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

时间:2009-10-28 20:06:01

标签: list dictionary python itertools

我似乎找不到从 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

它显然很容易解决,但是,似乎还有更好的方法。有吗?

6 个答案:

答案 0 :(得分:10)

我会使用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配方)是该页面上的函数pairwise,这基本上是我在这里建议的第二个。我认为每个site-packages目录都应该包含一个带有这些配方的iterutils.py文件(可惜这样的文件不是python的stdlib的一部分! - )。

答案 1 :(得分:9)

Lukáš Lalinský's answer相同的想法,不同的习语:

>>> dict(zip(*([iter(t)] * 2)))
{'a': 2, 'c': 4, 'b': 3}

这使用dictzipiter函数。它优于Lukáš的答案是它适用于任何可迭代的。工作原理:

  1. iter(t)在列表t上创建一个迭代器。
  2. [iter(t)] * 2创建一个包含两个元素的列表,它引用相同的迭代器。
  3. zip是一个函数,它接受两个可迭代对象并将它们的元素配对:第一个元素在一起,第二个元素在一起,等等,直到一个iterable耗尽。
  4. zip(*([iter(t)] * 2))导致t上的相同迭代器作为两个参数传递给zip。因此,zip将获取t的第一个和第二个元素并将它们配对。然后是第三和第四。然后是第五和第六等。
  5. dict使用包含(key, value)对的迭代,并从中创建一个dctionary。
  6. dict(zip(*([iter(t)] * 2)))根据OP的要求创建字典。

答案 2 :(得分:7)

效率不高,但如果您不需要非常大的列表:

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

或者使用生成器的版本:

dict(t[i:i+2] for i in xrange(0, len(t), 2))

答案 3 :(得分:6)

伙计们,伙计们,使用itertools。当列表变大时,你的低RAM用户会感谢你。

>>> from itertools import izip, islice
>>> t = ['a',2,'b',3,'c',4]
>>> s = dict(izip(islice(t, 0, None, 2), islice(t, 1, None, 2)))
>>> s
{'a': 2, 'c': 4, 'b': 3}

它可能看起来不漂亮,但它不会制作不必要的内存副本。

答案 4 :(得分:2)

使用stream模块:

>>> from stream import chop
>>> t = ['a',2,'b',3,'c',4]
>>> s = t >> chop(2) >> dict
>>> s
{'a': 2, 'c': 4, 'b': 3}

应该注意的是,这个模块相当模糊,并没有真正“按规则”播放通常被认为是政治上正确的Python。所以如果你只是学习Python,请不要走这条路;坚持标准库中的内容。

答案 5 :(得分:1)

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

可能不是最有效的。适用于python 3;你可能需要在python 2.x

中导入zip