代码之家  ›  专栏  ›  技术社区  ›  Rizwan Kassim

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

  •  1
  • Rizwan Kassim  · 技术社区  · 15 年前

    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 回复  |  直到 12 年前
        1
  •  10
  •   Alex Martelli    15 年前

    我会用 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)
    

    我,我认为这是个骗局,但有些人可能会觉得这是一种享受。瞧,我觉得这种事情很可怕,但很明显,在美国,每年这个时候事情都很可怕 是;-)。

    dict 他很乐意将一个2元组序列编入字典。我在这里展示的所有解决方案仅确保 O(1) 占用了额外的空间(显然超出了空间) O(N) ,这当然是输入列表和输出dict所需要的)。

    报告中建议的方法 docs (每个人都应该熟悉该页面,itertool配方)是函数 pairwise iterutils.py 用这些方法创建文件(可惜这样的文件还不是python的stdlib的一部分!)。

        2
  •  9
  •   Community miroxlav    7 年前

    Lukáš Lalinský's answer

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

    这使用 dict , zip iter 功能。与Luk的答案相比,它的优势在于它适用于任何iterable。工作原理:

    1. iter(t) 在列表上创建迭代器 t .
    2. [iter(t)] * 2 创建一个包含两个元素的列表,这两个元素引用同一迭代器。
    3. 拉链
    4. zip(*([iter(t)] * 2)) T 作为 . 拉链 因此,将采用
    5. 接受一个可替换的包含 (key, value) 配对并用它们创建一个dctionary。
    6. dict(zip(*([iter(t)] * 2))) 根据OP的请求创建字典。
        3
  •  7
  •   LukáÅ¡ Lalinský    15 年前

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

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

    dict(t[i:i+2] for i in xrange(0, len(t), 2))
    
        4
  •  6
  •   Steve Losh    15 年前

    伙计们,伙计们,用itertools。当列表变大时,内存不足的用户会感谢您。

    >>> 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}
    

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

        5
  •  2
  •   intuited    12 年前

    使用 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,请不要走这条路;坚持标准库中的内容。

        6
  •  1
  •   sc45    15 年前
    dict(zip(t[::2], t[1::2]))
    

    可能不是最有效的。在python 3中工作;您可能需要在Python2.x中导入zip