2016-07-25 132 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