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

时间:2012-11-24 01:55:41

标签: python

这是python中IDLE2中的代码,错误。

我需要包含每个"数据"元素作为关键和价值" otro",以有序的方式。那么"数据"和" 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
>>> 

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

2 个答案:

答案 0 :(得分:12)

我认为:

dik = dict(zip(dato,otro))

有点干净......


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

dik.update(zip(dato,otro))

如果你不了解zip,你应该投入一点时间学习它。这非常实用。

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

答案 1 :(得分:10)

错误来自:range(len(otro)+1)。当您使用range时,上限值实际上并未迭代,因此当您说range(5)时,您的迭代会转到0, 1, 2, 3, 4,其中位置5是元素{ {1}}。如果我们接着列出了这些列表元素并说4,则最终for i in range(len(nums)+1): print nums[i]将是i,正如您所看到的那样会导致错误。

更多'Pythonic'迭代某些东西的方法是不使用列表的len(nums) + 1 = 6 - 你遍历列表本身,必要时使用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

然而,保持Pythonicity主题,@ mgilson的>>> for index, item in enumerate(otro): ... dik[dato[index]] = item 是这个结构的更好版本。