这是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),这一切都很混乱
答案 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
是这个结构的更好版本。