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 3d=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