我以Mark Lutz的书“学习Python”为例。
keys = ['spam','eggs','toast']
vals=[1,4,7]
D2={}
for (v,k) in zip(keys, vals): D2[k] = v
D2
{1: 'spam', 4: 'eggs', 7: 'toast'}
我的例子:
D1={}
for (k,v) in zip(keys, vals): D1[k] = v
D1
{'toast': 7, 'eggs': 4, 'spam': 1}
所以,我仍然不理解索引,为什么是(v,k)?
答案 0 :(得分:6)
键和值列表的压缩列表的每个元组的键和值是unpacking,然后分配键/值对。 parens是不必要的for v, k in zip(keys, vals)
也将起作用。您和本书代码之间的区别在于v,k
的顺序,您使用keys
列表作为键,而本书则反过来。
你也可以在一步中创建dict,在压缩的项目上调用dict,如果你颠倒传递给zip的列表的顺序,那么你将得到完全相同的行为:
D2 = dict(zip(keys, vals))
print D2
D2 = dict(zip(vals, keys))
print(D2)
{'toast': 7, 'eggs': 4, 'spam': 1}
{1: 'spam', 4: 'eggs', 7: 'toast'}
唯一的区别是订单。列表被命名为键和值的事实可能有点令人困惑,因为值最终成为键,反之亦然,但要理解的主要是你在循环中为k
分配{{1}中的每个元素列表和书籍代码正好相反。
答案 1 :(得分:4)
zip 将返回list of tuples
:
演示:
>>> keys = ['spam','eggs','toast']
>>> vals=[1,4,7]
>>> zip(keys, vals)
[('spam', 1), ('eggs', 4), ('toast', 7)]
解包
演示:
>>> t = (1,2,3)
>>> t
(1, 2, 3)
>>> a,b,c = t
>>> a
1
>>> b
2
>>> c
3
>>> a,b = t
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>>
v
,第二项解包到k
。代码:
>>> D2={}
>>> for (v,k) in zip(keys, vals):
... print "v:", v
... print "k", k
... D2[k] = v
... # ^ ^
# Key Value
v: spam
k 1
v: eggs
k 4
v: toast
k 7
>>> D2
{1: 'spam', 4: 'eggs', 7: 'toast'}
>>>