【问题标题】:Iterating through a dictionary and subtracting values based on keys遍历字典并根据键减去值
【发布时间】:2016-07-25 16:17:38
【问题描述】:

所以我有一本像下面这样的字典,但是,我试图减去 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)}

【问题讨论】:

  • 你没有显示你的预期结果
  • else 块是否像您显示的那样缩进?因为那是错误的。缩进它下面的行
  • 我需要根据键减去这两个值,所以我的预期输出是 t=3 和 g=-3
  • 您的字典键是字母,元组是存储在键上的值。但是您正在尝试在字典上使用索引。我认为这不是您想要的 ART 数据结构。
  • 即使你交换ART 的字典结构,使得元组值是键,字母是值,输出将是无意义的,因为你会减去字母。

标签: python dictionary iteration


【解决方案1】:

通过键名访问字典。有关示例,请参阅here。

例如,ART['U'] 将返回 (5, 6)。在您的代码中,您尝试访问密钥2,因为这就是j 的含义。但是,字典中没有名为 2 的键。

【讨论】:

    【解决方案2】:

    您似乎想从字典中获取所有键组合。字典是无序的,所以ART[0] 没有任何意义1)。相反,您可以直接迭代键:

    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]
    

    或者更短,使用itertools.product:

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

    1) 除非您的字典中有键 0,但您没有。

    【讨论】:

    • 我的印象是这些字母是多余的,而 OP 确实在寻找元组列表作为数据结构。
    • @roganjosh 也许,但我不这么认为。毕竟,键都是元音,这可能有一些意义。
    • 评论要求索引和枚举字典。与此同时,我已经提出了另一个答案,但我们可能永远不会知道:)
    【解决方案3】:

    您在 cmets 中提到要通过索引调用字典中的项目。这是不可能的,因为字典是无序的。字典用于将特定的“键”映射到您针对该键存储的值。如果你print ART 几次,你会看到不同的排序。我认为您在这里不需要字典,而且我相信您选择字母来制作钥匙是为了制作钥匙。

    Python 使用零索引。因此,range(1, 5) 会错过 list 中的第一项,如果您正在迭代。您可能希望for x in range(0, 5) 获取列表中的所有元素,可以简单地写为for x in range(5)。

    最后,您的代码有i、j、k(从未使用过)、t 和g。这让事情变得非常更难理解,尤其是当 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]
    

    【讨论】:

    • 请注意,这可能不适用于所有情况。考虑像@​​987654331@ 这样的列表。 OP 正在检查索引是否不同,所以他可能也想处理 (1,2), (1,2) 对,但你的会跳过它。也许改用enumerate 来获取和比较索引?
    • @tobias_k 注意到并相应地进行了更改。谢谢。
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多