2

我有一个列表,我想将此列表转换为地图

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}

PS:我已经写了下面的函数做同样的工作,但我想使用 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        
4

4 回答 4

11

使用iter和字典理解:

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

相关:如何zip(*[iter(s)]*n)在 Python 中工作

于 2013-09-03T17:33:05.923 回答
4
>>> 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

于 2013-09-03T18:04:35.517 回答
1

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

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"]and[1,2,3]并将它们“压缩”在一起以给出一个列表,例如

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

dict获取一个可迭代的对并将它们转换为字典。

于 2013-09-03T18:15:52.980 回答
0

使用压缩和循环:-

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}
于 2013-09-03T17:41:02.807 回答