2017-04-17 112 views
2

的第一個字符我有一個​​dict如下:通過迭代與字符串>字符串字典只給每個

values = {'A1' : '123456', 'B1' : 123456, ....} 

我知道,通過遍歷正確的做法是:

for key, value in values.items(): 
    #do what you want 

通過錯誤,我忘了添加.items(),所以我開始越來越奇怪KeyError

我試圖打印,它只是得到第一個字符o f每個字符串,並將其分配給keyvalue

我的問題是:爲什麼python在做這個?現場發生了什麼?

+1

因爲它試圖做序列解包。 –

+0

它試圖將''A1''和其他鍵作爲元組進行解壓縮。默認情況下,迭代字典就像對其鍵進行迭代。 –

回答

3

當你寫:

for x1,x2 in iterable: 
    # ... 

,實際上意味着你做序列在Python拆包。 Python的評估它想:

x1,x2 = key0 

哪裏key0是第一個關鍵(當然其它鍵)。這工作如果key0是一個迭代,有正好兩個要素。在這種情況下,第一個元素被分配到x1,第二個元素被分配到x2

現在,一個字符串是一個可迭代的地方,其元素是字符。所以字符串'A1'有兩個元素:'A''1'。這意味着,如果你寫:

key,value = 'A1' 

key將舉行'A'value將舉行'1'。現在如果你打印key,它會因此打印出的第一個的值。

使用上的一個values.items()for沒有「神奇表述」items()簡單地是產生含有鍵和相應的值2元組可迭代。由於元組也是可迭代的,其中元素是元組的元素,所以元組被解壓縮到鍵和值中。因此,當您編寫:for key,value in values.items()時,.items()將生成一個序列,如('A1','123456')('B1',123456)。現在,如果這樣的元組被分配給key,value,它像寫作:

key,value = ('A1','123456') 

key所以將元組('A1')和value第二(123456)的第一個元素。

+1

啊!我認爲它會解開一個元組('dict_key','dict_value'),我現在看到。非常感謝你:) –

+0

所以你說如果我的關鍵字符串有超過三個字符的代碼將無法正常工作? [是的,我會得到'太多的值解包'錯誤] –

+1

@ Mhd.Tahawi:確實。但是,你可以寫'鍵爲值,*值。在這種情況下,'values'將成爲捕獲*剩餘*元素的列表。 –

2

認爲它是這樣的:

values = {'A1' : '123', 'B1' : 456} 

for key, value in values.items(): 
    #do what you want, e.g. 
    print(key) 
    print(value) 

# result: 
# A1 
# 123 
# B1 
# 456 

現在,沒有.items()

values = {'A1' : '123', 'B1' : 456} 

for entry in values: 
    print(entry) 
    a,b = entry 
    #do what you want, e.g. 
    print(a) 
    print(b) 

# result: 
# A1 
# A 
# 1 
# B1 
# B 
# 1 

正如你所看到的,該腳本讀取每個字典的關鍵,並從中獲得第2個元素(字符串的行爲與列表相似)。

+0

第二個代碼片段不起作用。因爲當你在'entry'上做'for'的時候。你很好地得到了字符串的字符。那些無法進一步解壓。 –

+0

正確 - 腳本已更正。謝謝 – jberrio

相關問題