【问题标题】:Concept Question on calling values in nested dictionaries for Python3Python3嵌套字典中调用值的概念问题
【发布时间】:2020-07-27 02:45:41
【问题描述】:

我必须找到一种方法,首先使用 for 循环在嵌套字典中查找某些值的总和,然后使用 sum 函数和字典理解在一行中查找。

我不能假设字典是有序的,它们的大小也不相同,但我可以假设每个嵌套的目标键:值对具有相同的键名。这是一个模拟示例字典:

dict1 = { "key 1" :
                { "key1a" : "abcde",
                "key_b_name" : 6, #take this value and add it to a running total
                "key1c" : [list1]},
            "key 2" :
                { "key2a" : "abcde",
                "key_b_name" : 32, #take this value and add it to a running total
                "key2c" : [list2]}
             ...
            }

我的 for 循环应该遍历所有可能出现的附加字典。解决这个问题的幼稚方法是什么?

我对 for 循环的思考过程首先是设置一个名为 running_total = 0 的变量,然后我希望 for_loop 遍历 dict1 和 running total += dict1[key_b_name"] 中的每个字典,然后最后打印运行总计。如果我遵循这种方法,我是否缺少调用嵌套字典的索引,如果是,语法是什么。

然后我仍在尝试掌握列表/字典理解的窍门,因此我需要了解如何用一行使用 sum 函数的代码替换 for 循环。

【问题讨论】:

  • 最大嵌套深度为1?
  • 是的,有最重要的 dict1,然后它有嵌套的字典,但仅此而已。

标签: python dictionary for-loop


【解决方案1】:
In [11]: dict1
Out[11]:
{'key 1': {'key1a': 'abcde', 'key1b': 6, 'key1c': ['a']},
 'key 2': {'key2a': 'abcde', 'key2b': 32, 'key2c': ['c']}}

In [12]: sum(v[i] for k,v in dict1.items() for i in v if i.startswith("key") and i.endswith("b"))
Out[12]: 38

更新: 由于键名保持不变,

In [17]: dict1
Out[17]:
{'key 1': {'key1a': 'abcde', 'key_b_name': 6, 'key1c': ['a']},
 'key 2': {'key2a': 'abcde', 'key_b_name': 32, 'key2c': ['a']}}

In [18]: sum(v[i] for k,v in dict1.items() for i in v if i == "key_b_name")
Out[18]: 38

【讨论】:

  • 这是一种非常有趣的方法,但唯一的问题是我不确定键实际上是否以“key”开头或以“b”结尾。它更像是一个概念的模拟字典,所以我可以学习这个方法。我还在尝试理解列表/字典理解。
  • @snicksnackpaddywhack91 如果您不知道键是什么,您怎么可能知道使用哪个键?你说:I want to get the totals of all the key<?>b values.
  • @MarkMeyer 是的,这就是我遇到的问题。有问题的提示只有完整的第一个字典,其中包含 5 个键:值对,然后只给了我一个“...”并告诉我写一行代码来查找所有隐含字典的总数。我相信它更多地是一个概念问题,应该适用于所有情况。编辑:“我想获得所有 key>b 值的总数”我​​的意思是暗示我想获得这些关键位置的每个值的总数。抱歉,不清楚
  • @MarkMeyer,我联系了我的助教,我对字典的假设是错误的(我假设顺序和大小是不变的),但我唯一能假设的是特定的键:值我正在查看的对在每个嵌套字典中都是相同的。他建议我先查看扩展的 for 循环,然后再尝试使用列表理解。关于如何解决这个问题的任何提示?
  • @snicksnackpaddywhack91 我鼓励编辑问题并在作业中提出确切的要求
【解决方案2】:
dict1 = { "key 1" :
                { "key1a" : "abcde",
                "key1b" : 6,
                "key1c" : ''},
            "key 2" :
                { "key2a" : "abcde",
                "key2b" : 32,
                "key2c" : ''}
        }

tot = [list(i.values())[1] for i in dict1.values()]
print(sum(tot))

输出:

38

【讨论】:

  • 我对 Python 还是很陌生,但我想我被告知我不能将索引值与字典键名一起使用。例如,我必须为每个键名调用键名 ["key1b"]。如果我可以使用索引号会容易得多,我假设你告诉我可以?
  • 我可以使用索引,因为首先我只取值,然后将它们转换为列表。如果你是 Python 新手,那么你会学习字典,你应该学习 keys() 和 values()
  • 啊!我懂了!代码行外的括号我没注意!那么这是否意味着我理解正确 - 我不能用字典调用索引位置?编辑:今晚我真的没注意,对不起,你甚至使用了 list 命令。我认为这个解决方案应该适用于所有情况。非常感谢您的解释!
  • 你不能直接使用字典的索引,即使你只取键或值。例如:some_dictonary.values()[0] 这个还是报错。您需要将它们转换为列表。正确:list(some_dictonary.values())[0]
  • 我刚刚联系了我的助教,看来我的假设不正确。嵌套字典的顺序和大小不是恒定的/不能假设。但是我们可以假设键:值对在每个字典中都是相同的。我想我需要用 for 循环和列表理解简写来重新设计这个。
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多