Python 将列表转换为字典

Python 将列表转换为字典,python,list,dictionary,Python,List,Dictionary,我想将此列表转换为字典,如: l = ["a", "b", "c", "d", "e"] 所以基本上,偶数是关键,而几率是价值。我知道我可以用一种“非pythonic”的方式来实现它,比如使用if语句的for循环,但我相信应该有一种更“pythonic”的方式来实现这一点。因此,我非常感谢您的帮助:)使用通常的方法,您可以: Python 2: d = {"a": "b", "c": "d", "e": ""} d = dict(itertools.izip_longest(*[iter(l

我想将此列表转换为字典,如:

l = ["a", "b", "c", "d", "e"]
所以基本上,偶数是关键,而几率是价值。我知道我可以用一种“非pythonic”的方式来实现它,比如使用if语句的for循环,但我相信应该有一种更“pythonic”的方式来实现这一点。因此,我非常感谢您的帮助:)

使用通常的方法,您可以:

Python 2:

d = {"a": "b", "c": "d", "e": ""}
d = dict(itertools.izip_longest(*[iter(l)] * 2, fillvalue=""))
Python 3:

d = {"a": "b", "c": "d", "e": ""}
d = dict(itertools.izip_longest(*[iter(l)] * 2, fillvalue=""))

不确定它是否对您有帮助,但对我有效:

d = dict(itertools.zip_longest(*[iter(l)] * 2, fillvalue=""))
l=[“a”、“b”、“c”、“d”、“e”]
outRes=dict((l[i],l[i+1]),如果i+1
我会选择递归:

l = ["a", "b", "c", "d", "e"]
outRes = dict((l[i], l[i+1]) if i+1 < len(l) else (l[i], '') for i in xrange(len(l)))

如果你还在想什么的话!你不会孤单,其实也没那么复杂,让我解释一下

如何仅使用内置函数将列表转换为字典 我们希望将下面的列表转换为一个字典,使用奇数项(从1开始计数)作为映射到其连续偶数项的键

l = ['a', 'b', 'c', 'd', 'e', ' ']
d = dict([(k, v) for k,v in zip (l[::2], l[1::2])])
dict() 要创建字典,我们可以使用内置的
dict
功能,根据手册,支持以下方法

l = ["a", "b", "c", "d", "e"]
最后一个选项建议我们提供一个包含2个值或
(key,value)
元组的列表,因此我们希望将顺序列表转换为:

dict(one=1, two=2)
dict({'one': 1, 'two': 2})
dict(zip(('one', 'two'), (1, 2)))
dict([['two', 2], ['one', 1]])
我们还介绍了
zip
功能,手册对此进行了说明:

返回元组列表,其中第i个元组包含每个参数的第i个元素

换句话说,如果我们可以将我们的列表变成两个列表
a、c、e
b、d
,那么
zip
将完成其余的工作

切片表示法 我们看到它与一起使用,并且在中更进一步,它主要使用范围短片表示法,但这就是长片表示法的外观,以及我们可以通过步骤实现的功能:

l = [["a", "b"], ["c", "d"], ["e",]]
尽管这是理解所涉及的机制的最简单方法,但也有一个缺点,因为切片每次都是新的列表对象,从这个克隆示例可以看出:

>>> l[::2]
['a', 'c', 'e']

>>> l[1::2]
['b', 'd']

>>> zip(['a', 'c', 'e'], ['b', 'd'])
[('a', 'b'), ('c', 'd')]

>>> dict(zip(l[::2], l[1::2]))
{'a': 'b', 'c': 'd'}
尽管b看起来像a,但它们现在是两个独立的对象,这就是为什么我们更喜欢使用

石斑鱼食谱 虽然grouper被解释为itertools模块的一部分,但它也可以很好地处理基本功能

一些严重的巫毒,对吗?=)但实际上,对于香料来说,没有什么比一点语法糖更重要的了,石斑鱼的食谱是由以下表达式完成的

>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]

>>> b is a
True

>>> b = a[:]
>>> b
[1, 2, 3]

>>> b is a
False
如果有意义的话,它或多或少会转换为一个列表中包装的同一迭代器的两个参数。让我们把它分解一下,以帮助我们了解一些情况

最短的拉链 如果您注意到空键
e
在所有示例中都没有,这是因为
zip
选择了两个参数中最短的一个,那么空键怎么办呢

一种解决方案可能是在奇数长度列表中添加一个空值,您可以选择使用
append
if
语句,这会起到作用,尽管有点无聊,对吧

>>> it = iter(l)     
>>> dict(zip(it, it))
{'a': 'b', 'c': 'd'}
现在,在您耸耸肩准备从itertools import izip_longest中键入
之前,您可能会惊讶地发现它不是必需的,我们可以通过单独使用内置函数来实现同样的、甚至更好的IMHO

最长地图 我更喜欢使用,而不是它不仅使用较短的语法,不需要导入,而且它可以在需要时自动分配实际的
None
空值

>>> if len(l) % 2:
...     l.append("")

>>> l
['a', 'b', 'c', 'd', 'e', '']

>>> dict(zip(*[iter(l)]*2))
{'a': 'b', 'c': 'd', 'e': ''}
正如KursedMetal所指出的,比较这两种方法的性能,很明显,itertools模块在大容量上远远优于map函数,这是针对1000万条记录的基准

>>> l = ["a", "b", "c", "d", "e"]
>>> l
['a', 'b', 'c', 'd', 'e']

>>> dict(map(None, *[iter(l)]*2))
{'a': 'b', 'c': 'd', 'e': None} 
然而,导入模块的成本对较小的数据集产生了影响,当这些数据集开始迎头到达时,地图返回速度要快得多,多达10万条记录

$ time python -c 'dict(map(None, *[iter(range(10000000))]*2))'
real    0m3.755s
user    0m2.815s
sys     0m0.869s
$ time python -c 'from itertools import izip_longest; dict(izip_longest(*[iter(range(10000000))]*2, fillvalue=None))'
real    0m2.102s
user    0m1.451s
sys     0m0.539s
什么也看不见!=)


哎呀

您也可以使用
d=dict(itertools.izip_longest(l[::2],l[1::2],fillvalue='')
,或者使用Python 3
d=dict(itertools.zip_longest(l[::2],l[1::2],fillvalue='')
。您的版本运行得很好,但是对于那些没有意识到
[iter(l)]*2
创建了一个包含对同一迭代器的两个引用的列表的人来说,可能会有点混淆。(
[iter(l)]*2
->
[,]
)@JAB:由于石斑鱼的配方非常普遍,我看不到你的方法有足够的好处来证明创建两个
l
(使用
l[:2]
l[1::2]
)的合理性。嗯,由于使用了
del x[:1],我一直假设切片是一个对象的视图,而不是实际的副本
x[:]=[2,3]
等。作为对可变序列的操作,以及numpy实现数组切片作为视图的事实,但实际上似乎不是这样,我认为更有效的方法是
d=dict(izip_longest(islice(l,0,None,2),islice(l,1,None,2),fillvalue='')
。我想知道是否有提交的特性请求,如果有,响应是什么…Python 3不支持
map(None…)
,因此您的解决方案仅限于Python 2。XPython 3.4.3支持map(None…),例如dict(map(None,*[iter(l)]*2)返回dict(map(None,*[iter(l)]*2)),用于l=['a','b','c','d','e']为什么这是递归的?我觉得这已经足够了(zip(l[::2],l[1::2])
)。Python3.8.5对我来说效果很好,值得注意的是+1表示从1开始,如果你的从0开始,只需删除+1即可。对我来说工作很有魅力!不错!
$ time python -c 'dict(map(None, *[iter(range(100))]*2))'
real    0m0.046s
user    0m0.029s
sys     0m0.015s
$ time python -c 'from itertools import izip_longest; dict(izip_longest(*[iter(range(100))]*2, fillvalue=None))'
real    0m0.067s
user    0m0.042s
sys     0m0.021s

$ time python -c 'dict(map(None, *[iter(range(100000))]*2))'
real    0m0.074s
user    0m0.050s
sys     0m0.022s
$ time python -c 'from itertools import izip_longest; dict(izip_longest(*[iter(range(100000))]*2, fillvalue=None))'
real    0m0.075s
user    0m0.047s
sys     0m0.024s