Python 如何将两个列表转换为字典(一个列表是键,另一个是值)?
这是python中IDLE2中的代码,错误为 我需要以有序的方式将每个“数据”元素包含为键和值“otro”。“data”和“otro”是38个字符串的列表,而“dik”是一本字典Python 如何将两个列表转换为字典(一个列表是键,另一个是值)?,python,Python,这是python中IDLE2中的代码,错误为 我需要以有序的方式将每个“数据”元素包含为键和值“otro”。“data”和“otro”是38个字符串的列表,而“dik”是一本字典 >>> for i in range(len(otro)+1): dik[dato[i]] = otro[i] Traceback (most recent call last): File "<pyshell#206>", line 2, in <module&g
>>> for i in range(len(otro)+1):
dik[dato[i]] = otro[i]
Traceback (most recent call last):
File "<pyshell#206>", line 2, in <module>
dik[dato[i]] = otro[i]
IndexError: list index out of range
>>>
>适用于范围内的i(len(otro)+1):
dik[dato[i]=otro[i]
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
dik[dato[i]=otro[i]
索引器:列表索引超出范围
>>>
此问题的范围为(0,38)
输出->(0,1,2,3…37)并且它是混乱的错误来自于这个:
范围(len(otro)+1)
。当您使用range
时,上限值实际上不是迭代的,因此当您说range(5)
例如,您的迭代是0,1,2,3,4
,其中位置5
是元素4
。然后,如果我们获取该列表元素并对范围内的i(len(nums)+1)说:print nums[i]
,那么最后的i
将是len(nums)+1=6
,如您所见,这将导致错误
迭代某些内容的更为“Pythonic”的方法是不要使用列表的len
——您迭代列表本身,必要时使用enumerate
拉出索引:
In [1]: my_list = ['one', 'two', 'three']
In [2]: for index, item in enumerate(my_list):
...: print index, item
...:
...:
0 one
1 two
2 three
将此应用到您的案例中,您可以说:
>>> for index, item in enumerate(otro):
... dik[dato[index]] = item
然而,与Pythonicity主题保持一致,@mgilson的
zip
是这个结构的更好版本。我认为类似于:
dik = dict(zip(dato,otro))
有点干净
如果
dik
已经存在,并且您正在更新它:
dik.update(zip(dato,otro))
如果你不知道,你应该花点时间学习。它非常有用
a = [ 1 , 2 , 3 , 4 ]
b = ['a','b','c','d']
zip(a,b) #=> [(1,'a'),(2,'b'),(3,'c'),(4,'d')] #(This is actually a zip-object on python 3.x)
zip
还可以接受更多的参数(zip(a,b,c)
),例如,它将为您提供一个3元组列表,但这对于这里的讨论并不十分重要
这恰好是“构造函数”(type)喜欢初始化一组
键值对的事情之一。每个元组
中的第一个元素是键
,第二个元素是值
你能大声读出最后一行,想想解释器在告诉你什么吗?-1。这可能是个问题,但它并不能真正让代码变得更好。为什么循环索引?对于枚举中的i,o(otro):
有点“整洁”。或用于邮政编码中的d,o(dato,otro):
。或者dik=dict(zip(dato,otro))
而不是整个块。@Lattyware哈,读懂我的心思-我现在在扩充:)@millimoose为什么需要索引zip()+1.这是最好的解决方案,尽管RocketDonkey的回答很好地解释了当前解决方案失败的原因。@Lattyware--同意+1对他的:)@mgilson+1到处都是-这绝对干净。没关系!!!谢谢,格雷西亚斯!!这是一条巨蟒!dictionary.update(zip(列表1、列表2))