2

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

这个问题是 range(0, 38) 输出 -> (0, 1,2,3 ... 37) 而且很乱

4

2 回答 2

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对的事情之一。每个中的第一个元素tuplekey,第二个元素是value

于 2012-11-24T02:01:03.850 回答
10

错误来自这个:range(len(otro)+1)。当你使用range时,上限值实际上并没有被迭代,所以当你说range(5),例如,你的迭代是0, 1, 2, 3, 4,其中 position5是元素4。如果我们然后获取该列表元素并说for i in range(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 主题保持一致,@mgilsonzip是此构造的更好版本。

于 2012-11-24T01:57:10.490 回答