2015-05-14 40 views
3

我以Ma​​rk Lutz书籍学习Python为例。用于循环索引的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)?

回答

6

它是从unpacking键和值列表的压缩列表的每个元组中的键和值,则分配的键/值对。这些零件是不必要的for v, k in zip(keys, vals)也将工作。你和书的代码之间的差异是v,k的顺序,你使用keys列表作为关键字,而书本则反过来。

你也可以在压缩项目创建一个步骤调用字典的字典,如果反向传递到压缩列表的顺序,那么你将获得完全相同的行为:

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分配给keys列表中的每个元素,并且书的代码是做相反的事情。

4

拉链将返回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 
>>> 

  1. 我们反复在列表中,因此它的拆包从元组的第一项v和第二至k
  2. 在D2字典中创建新的密钥和值对。

代码:

>>> 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'} 
>>>