簡體   English   中英

使用理解創建Python字典

[英]Creating a Python dictionary using a comprehension

我試圖在python 2.7.3中創建一個python字典,其中包含以下值:

'A':1
'B':2
'C':3
  .
  .
  .
  .
'Z':26

使用以下任一行:

theDict = {x:y for x in map(chr,range(65,91)) for y in range(1,27)}

要么

theDict = {x:y for x in map(chr,range(65,91)) for y in list(range(1,27))}

在這兩種情況下,我得到以下結果:

'A':26
'B':26
'C':26
  .
  .
  .
  .
'Z':26

我不明白為什么第二個沒有產生數字1-26。 也許是,但如果是這樣,我不明白為什么我只得到26每個鍵的價值。 如果我不創建字典(即只用x或y更改x:y),則x =大寫字母,y = 1-26。

有人可以解釋我做錯了什么,並建議一種可能的方法來獲得我想要的結果。

為什么這是錯的:你的列表理解是嵌套的。 它實際上是這樣的:

d = {}
for x in map(chr, range(65, 91)):
    for y in range(1,27):
        d[x] = y

如您所見,這不是您想要的。 它的作用是將y設置為1,然后遍歷字母表,將所有字母設置為1,即{'A':1, 'B':1, 'C':1, ...} 然后它再次為2,3,4,一直到26。因為它是一個字典,后來的設置覆蓋了早期的設置,你看到你的結果。

這里有幾個選項,但一般來說,迭代多個伴隨列表的解決方案更像是這樣的模式:

[some_expr(a,b,c) for a,b,c in zip((a,list,of,values), (b, list, of, values), (c, list, of values))]

zip從每個子列表中提取一個值,並使其成為每次迭代的元組。 換句話說,它將每個4個項目的3個列表轉換為4個列表,每個列表包含3個項目(在上面)。 在您的示例中,當您需要26對時,您有2個26項列表; zip會為你做到這一點。

嘗試:

>>> {chr(k):k-64 for k in range(65,91)} 
{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4, 'G': 7, 'F': 6, 'I': 9, 'H': 8, 'K': 11, 'J': 10, 'M': 13, 'L': 12, 'O': 15, 'N': 14, 'Q': 17, 'P': 16, 'S': 19, 'R': 18, 'U': 21, 'T': 20, 'W': 23, 'V': 22, 'Y': 25, 'X': 24, 'Z': 26}

或者,如果你想做你正在做的事情,請使用zip:

>>> {x:y for x,y in zip(map(chr,range(65,91)),range(1,27))}
{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4, 'G': 7, 'F': 6, 'I': 9, 'H': 8, 'K': 11, 'J': 10, 'M': 13, 'L': 12, 'O': 15, 'N': 14, 'Q': 17, 'P': 16, 'S': 19, 'R': 18, 'U': 21, 'T': 20, 'W': 23, 'V': 22, 'Y': 25, 'X': 24, 'Z': 26}

你的理由是你的理解是執行外部循環時間的內部。 即,在shell中嘗試這個:

>>> [(chr(outter), inner) for outter in range(65,91) for inner in range(1,27)]
[('A', 1), ('A', 2), ('A', 3), ('A', 4),... ('A', 26),
...
...
('Z', 1), ('Z', 2), ('Z', 3), ('Z', 4), ..., ('Z', 26)]

所以,如果你這樣做:

>>> len([(chr(outter), inner) for outter in range(65,91) for inner in range(1,27)])
676

你可以看到它正在執行26x26次(26x26 = 676)

由於dict將使用新值更新,因此使用每個字母的最后一個值:

>>> dict([(chr(outter), inner) for outter in range(65,91) for inner in range(1,27)])
{'A': 26, 'C': 26, 'B': 26, 'E': 26, 'D': 26, 'G': 26, 'F': 26, 'I': 26, 'H': 26, 'K': 26, 'J': 26, 'M': 26, 'L': 26, 'O': 26, 'N': 26, 'Q': 26, 'P': 26, 'S': 26, 'R': 26, 'U': 26, 'T': 26, 'W': 26, 'V': 26, 'Y': 26, 'X': 26, 'Z': 26}

這說明了為什么你得到了你得到的東西。

您可以嘗試以下方法:

theDict = {chr(y):y - 64 for y in range(65, 91)}
print theDict

輸出:

{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4, 'G': 7, 'F': 6, 'I': 9, 'H': 8, 'K': 11, 'J': 10, 'M': 13, 'L': 12, 'O': 15, 'N': 14, 'Q': 17, 'P': 16, 'S': 19, 'R': 18, 'U': 21, 'T': 20, 'W': 23, 'V': 22, 'Y': 25, 'X': 24, 'Z': 26}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM