如何将两个列表转换为字典(一个列表是键,另一个是值)? [复制]
Posted
技术标签:
【中文标题】如何将两个列表转换为字典(一个列表是键,另一个是值)? [复制]【英文标题】:how to convert two lists into a dictionary (one list is the keys and the other is the values)? [duplicate] 【发布时间】:2012-11-12 07:42:22 【问题描述】:这是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) 很乱
【问题讨论】:
你能大声读出最后一行,想想口译员在告诉你什么吗? 【参考方案1】:错误来自: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
提取索引:
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
是此构造的更好版本。
【讨论】:
-1。这可能是问题所在,但它并没有真正使代码变得更好。为什么要循环索引?for i, o in enumerate(otro):
有点“整洁”。或for d, o in zip(dato, otro):
。或者 dik = dict(zip(dato,otro))
而不是整个区块。
@Lattyware 哈,读懂我的想法——我现在正在扩充 :)
@millimoose 为什么需要这里的索引? zip()
迭代器,如果你需要循环两个。
@Lattyware 因为我在提交评论后大约 0.5 秒就想到了zip()
;)【参考方案2】:
我认为是这样的:
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。这是最好的解决方案,尽管 RocketDonkey 的回答很好地解释了当前解决方案失败的原因。 @Lattyware -- 同意。 +1 给他的 :) @mgilson +1's all around - 这绝对更干净。 没关系!!!谢谢,谢谢! muchachos es el poder de python!字典.update(zip(list1,list2))以上是关于如何将两个列表转换为字典(一个列表是键,另一个是值)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章