Python 如何将两个列表转换为字典(一个列表是键,另一个是值)?

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

这是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>
    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))