关于python:如何将两个列表转换成一个字典(一个列表是键,另一个是值)?

how to convert two lists into a dictionary (one list is the keys and the other is the values)?

本问题已经有最佳答案,请猛点这里访问。

这是Python中idle2中的代码,还有错误。

我需要以有序的方式将每个"数据"元素作为键和值"otro"。"data"和"otro"是38个字符串的列表,而"dik"是一本字典。

1
2
3
4
5
6
7
8
>>> 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
>>>

这个问题是范围(0,38)输出->(0,1,2,3…37)一切都很混乱


我想是这样的:

1
dik = dict(zip(dato,otro))

有点干净…

如果dik已经存在,而您只是在更新它:

1
dik.update(zip(dato,otro))

如果你不了解zip,你应该花点时间学习它。它非常有用。

1
2
3
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元组列表,但这对于这里的讨论并不十分重要。

这恰好是dict的"构造函数"(类型)喜欢初始化一组key-value对的事情之一。每个tuple中的第一个元素是key,第二个元素是value


错误来源于:range(len(otro)+1)。当你使用range时,上面的值实际上没有迭代,所以当你说range(5)时,你的迭代是0, 1, 2, 3, 4,其中位置5是元素4。如果我们取这个列表元素,并说for i in range(len(nums)+1): print nums[i],那么最终的i将是len(nums) + 1 = 6,正如您所看到的,这将导致一个错误。

迭代某些内容的"pythonic"方法是不使用列表中的len–您迭代列表本身,必要时使用enumerate–拉出索引:

1
2
3
4
5
6
7
8
9
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

将此应用于您的案例,然后您可以说:

1
2
>>> for index, item in enumerate(otro):
...    dik[dato[index]] = item

然而,与pythonicity主题保持一致,@mgilson的zip是这个结构的更好版本。