2016-07-25 102 views
-1

所以我有一個像下面的字典,但是,我試圖減去ART [0] [0] - ART [1] [0],這必須是一個迭代。迭代通過字典和減去基於密鑰的值

這是我的,但它似乎沒有工作。我不斷收到錯誤:'KeyError:2'

任何幫助,將不勝感激。

for i in range(1, 5): #from 
     k = i 
     for j in range (1, 5): #to 
      if i == j: 
       pass 
      else: 
       t = ART[j][0] - ART[i][0] 
       g = ART[j][1] - ART[i][1] 

樣品輸入:

ART = {'U': (5, 6), 'E': (7, 3), 'A': (3, 3), 'O': (3, 2), 'I': (1, 4)}

+3

您還沒有表現出您期望的結果 –

+0

縮進你展示else塊?因爲這是錯誤的。縮進它下面的行 –

+0

我需要減去基於鍵的兩個值,所以我的預期輸出是t = 3和g = -3 –

回答

0

字典是由鍵名訪問。例子見here。例如,ART['U']將返回(5, 6)。在你的代碼中,你試圖訪問一個密鑰2,因爲這就是j等於的值。但是,字典中沒有鍵名爲2

0

看起來你想要從字典中獲得所有鍵的組合。字典是無序的,所以ART[0]沒有任何意義1)。使用itertools.product

for i in ART: 
    for j in ART: 
     if i != j: 
      t = ART[j][0] - ART[i][0] 
      g = ART[j][1] - ART[i][1] 

或更短,:相反,您可以直接遍歷鍵

for i, j in itertools.product(ART, repeat=2): 
    if ... 

1)除非你有你的字典中的關鍵0,你不要「T。

+0

我感覺這些字母是多餘的,OP真的在尋找一個元組列表作爲數據結構。 – roganjosh

+0

@roganjosh也許,但我不這麼認爲。畢竟,鑰匙都是元音,可能有一些意義。 –

+0

評論請求索引和列舉字典。在此期間我已經提出了另一個答案,但我們可能永遠不知道:) – roganjosh

0

您在評論中提到您想通過索引調用詞典中的項目。這是不可能的,因爲字典是無序的。字典用於將特定的「鍵」映射到您針對該鍵存儲的值。如果你print ART幾次,你會看到不同的順序。我不認爲你想在這裏找到字典,我相信你已經選擇了字母來製作鑰匙,以便製作鑰匙。

Python使用零索引。因此,如果您正在迭代,range(1, 5)將錯過列表中的第一項。你會想要for x in range(0, 5)獲得列表中的所有元素,它可以簡寫爲for x in range(5)

最後,您的代碼有i,j,k(從未使用),tg。這使得難以理解,特別是當Python爲你提供很大的命名靈活性時。

有了這些假設,我想你想一個元組列表作爲你的數據結構:

ART = [(5, 6), (7, 3), (3, 3), (3, 2), (1, 4)] 
for i, item in enumerate(ART): 
    for j, pair_item in enumerate(ART): 
     if i != j: 
      t = item[0] - pair_item[0] 
      g = item[1] - pair_item[1] 
+1

請注意,這可能不適用於所有情況。考慮一個像[(1,2),(3,4),(1,2)]'的列表。 OP正在檢查指數是否不同,所以他可能會想要處理'(1,2),(1,2)'對,但是你的將會跳過它。也許用'enumerate'來獲取和比較索引? –

+0

@tobias_k通知並做出相應更改。謝謝。 – roganjosh