我有以下代碼:的Python:列表字典理解
letters = 'defghijklmno'
K = {letters[i]:(i*i-1) for i in range(len(letters))}
我明白,我遍歷的字母序列變量和值是如何計算的,但我對如何關鍵困惑被設置爲字符串的單個字符。特別是因爲我的信件被索引爲我的鑰匙。基本上,我只是想弄清楚python如何評估這個表達式。
我有以下代碼:的Python:列表字典理解
letters = 'defghijklmno'
K = {letters[i]:(i*i-1) for i in range(len(letters))}
我明白,我遍歷的字母序列變量和值是如何計算的,但我對如何關鍵困惑被設置爲字符串的單個字符。特別是因爲我的信件被索引爲我的鑰匙。基本上,我只是想弄清楚python如何評估這個表達式。
要了解它,有助於查看所發生情況的各個部分。一個for i in range(len(letters))
循環不會遍歷字母的單個字符,而是遍歷字符串的指針。這是因爲您可以使用索引訪問字符串的殘餘字符。所以letters[0]
指的是第一個字符,第二個爲letters[1]
,第二個爲letters[len(letters)-1]
。
那麼,讓我們看看個別字典的鍵:
>>> [letters[i] for i in range(len(letters))]
['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
所以,你得到單獨在原訂單中所有的字母。
現在,讓我們看看字典的值:
>>> [(i*i-1) for i in range(len(letters))]
[-1, 0, 3, 8, 15, 24, 35, 48, 63, 80, 99, 120]
所以,現在我們有兩個鍵和值;字典理解現在所做的就是將這些鍵鏈接到值上面。
嗯,首先,這是一個相當糟糕的做法。通過指數循環是Python中一個非常糟糕的做法(這是慢,可怕的讀取),所以更好的辦法是這樣的:
letters = 'defghijklmno'
K = {letter: (i*i-1) for i, letter in enumerate(letters)}
這一切是一個簡單的dictionary comprehension。當我們循環一個字符串時,我們會得到個別字符。我們使用內建的enumerate()
爲我們提供匹配的數字,然後從字母到數字的平方減去一個字典。
如果你在理解本身上掙扎,它相當於一個for循環(除了更快),並且我建議你觀看my video以獲得一個完整的解釋,例子包括它的表兄弟(列表/集合理解和生成器表達式)。
第二行是字典理解。它就像一個普通的列表理解或生成器表達式,除了它生成的鍵值對被用來形成一個字典。
的代碼是大致相當於
letters = 'defghijklmno'
K = {}
for i in range(len(letters)):
key = letters[i]
val = (i*i-1)
K[key] = val
即dict
理解基本上是同義詞:
k = {}
for i in range(len(letters)):
k[letters[i]] = i*i - 1
不同的是,它創建,而不是使用外部範圍新範圍:
>>> letters = 'defghijklmno'
>>> K = {letters[i]:(i*i-1) for i in range(len(letters))}
>>> i # was defined in an inner scope
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined
>>> k = {}
>>> for i in range(len(letters)):
... k[letters[i]] = i*i - 1
...
>>> i # still defined!
11
您可以將Dict理解改寫爲循環
K = {} # empty dict
for i in range(len(letters)): # i goes from 0 to 11
K[letters[i]] = i*i-1
所以在單次迭代你有
K['d'] = -1
K['e'] = 0
K['f'] = 3
# ...
等。 dict理解只是一個更短的(並且大多數python程序員認爲)寫這個循環更優雅的方式。
說明:
>>> letters = 'defghijklmno'
>>> range(len(letters))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
這意味着,
>>> [letters[i] for i in range(len(letters))]
['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
同時
>>> [(i*i-1) for i in range(len(letters))]
[-1, 0, 3, 8, 15, 24, 35, 48, 63, 80, 99, 120]
所以,你的字典解析建立對'd':-1, 'e':0, 'f':3, ...
(ETC)的字典。
對於每一個從i
到i == 0
i == 11
(在letters
最後一個字母的索引),一個條目被添加到所得的字典其中鍵是letters[i]
及其相關聯的值是i*i-1
。這給出:
K['d'] == -1
K['e'] == 0
K['f'] == 3
等等。
你實際上並沒有遍歷letters
的字母,相反,你遍歷長度letters
,通過改變從0
i
,以1
,到2
,...,到11
。當您更改i
時,您將創建一個字典條目,其關鍵是i
個字母letters
,其值爲i*i - 1
。
換句話說,你創建一個字典,其中每個條目包含一封來自letters
(鍵)k
,等於k
的指數值配對的平方減去1
。
您可以用簡單的英語閱讀字典解析爲:所有的字母(鍵)k
從letters
索引i
,與價值i*i - 1
配對的字典。
爲什麼downvote? – poke