2015-05-14 49 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'} 
>>>