【问题标题】:list to map in python在python中映射的列表
【发布时间】:2013-09-03 17:31:59
【问题描述】:

我有一个列表,我想把这个列表转换成地图

mylist = ["a",1,"b",2,"c",3]

mylist 等价于

mylist = [Key,Value,Key,Value,Key,Value]

所以输入:

mylist = ["a",1,"b",2,"c",3]

输出:

mymap = {"a":1,"b":2,"c":3}

P.S:我已经写了下面的函数做同样的工作,但我想使用 python 的迭代器工具:

def fun():
    mylist = ["a",1,"b",2,"c",3]
    mymap={}
    count = 0
    for value in mylist:
        if not count%2:
            mymap[value] = mylist[count+1]
        count = count+1
    return mymap        

【问题讨论】:

    标签: python list dictionary itertools


    【解决方案1】:

    使用iter 和dict-comprehension:

    >>> mylist = ["a",1,"b",2,"c",3]
    >>> it = iter(mylist)
    >>> {k: next(it) for k in it}
    {'a': 1, 'c': 3, 'b': 2}
    

    使用zipiter

    >>> dict(zip(*[iter(mylist)]*2)) #use `itertools.izip` if the list is huge.
    {'a': 1, 'c': 3, 'b': 2}
    

    相关:How does zip(*[iter(s)]*n) work in Python

    【讨论】:

    • 第二个解决方案很漂亮。
    • Ashwini,你能解释一下你的第二个解决方案吗??
    • it = iter(mylist); dict(zip(it, it)) 如果您希望将第二个解决方案作为反映第一个解决方案的双线。
    • 也是切片解决方案:dict(zip(mylist[::2], mylist[1::2]))
    【解决方案2】:
    >>> mylist = ["a",1,"b",2,"c",3]
    >>> zippedlist = zip(mylist [0::2],mylist [1::2]) #slicing magic
    >>> zippedlist
    [('a', 1), ('b', 2), ('c', 3)]
    >>> dictedlist = dict(zippedlist)
    >>> dictedlist 
    {'a': 1, 'c': 3, 'b': 2}
    

    这是因为切片[start:stop:skip]

    列表从 0 开始,跳过 2

    压缩包

    列表从 1 开始,跳过 2

    【讨论】:

      【解决方案3】:

      要从列表中获取所有键,您可以执行以下操作:

      keys = mylist[::2]
      

      mylist[::2] 通过迭代 mylist 中从索引 0 开始的每个第二个元素来创建一个新列表。

      要从列表中获取所有值,您可以这样做:

      vals = mylist[1::2]
      

      mylist[1::2] 通过迭代 mylist 中从索引 1 开始的每个第二个元素来创建一个新列表。

      然后你就可以使用 dict 和 zip:

      dict(zip(keys,vals))  # or all in one line
      dict(zip(mylist[::2], mylist[1::2]))
      

      zip 需要两个列表,例如 ["a","b","c"][1,2,3],然后将它们“压缩”在一起以给出类似

      的列表
      [("a",1), ("b", 2), ("c", 3)]
      

      dict 采用可迭代的对并将它们转换成字典。

      【讨论】:

        【解决方案4】:

        使用压缩和循环:-

        from itertools import compress
        from itertools import cycle
        
        def fun(mylist):
            keys = compress(mylist,cycle([1,0]))
            values = compress(mylist,cycle([0,1]))
            mymap = dict(zip(keys,values))
            return mymap
        
        mylist = ["a",1,"b",2,"c",3]
        
        fun(mylist)
        {'a': 1, 'c': 3, 'b': 2}
        

        【讨论】:

          猜你喜欢
          • 2011-04-27
          • 2011-02-13
          • 1970-01-01
          • 2020-03-15
          • 2021-07-02
          • 1970-01-01
          • 2020-09-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多