Python 为什么使用.items()允许我遍历defaultdict,否则变量读取错误?

Python 为什么使用.items()允许我遍历defaultdict,否则变量读取错误?,python,dictionary,defaultdict,Python,Dictionary,Defaultdict,当尝试遍历defaultdict时,我的变量被读取为字符串,而它们应该被读取为列表,然而,当我稍微更改代码时,它工作了,但我不知道确切的原因。我的defaultdict是一个包含字典列表的听写工具。代码是这样的 for engagement in engagement_by_account: for engagement in engagement: engagement['total_minutes_visited'] = float(engagement['total_minute

当尝试遍历defaultdict时,我的变量被读取为字符串,而它们应该被读取为列表,然而,当我稍微更改代码时,它工作了,但我不知道确切的原因。我的defaultdict是一个包含字典列表的听写工具。代码是这样的

for engagement in engagement_by_account:
 for engagement in engagement:
    engagement['total_minutes_visited'] = float(engagement['total_minutes_visited'])
错误是:

TypeError: string indices must be integers
但是,当我将代码更改为以下内容时:

for key,engagement in engagement_by_account.items():
 for engagement in engagement:
    engagement['total_minutes_visited'] = float(engagement['total_minutes_visited'])

不再有错误。

默认情况下,当您迭代字典(或
defaultdict
)时,您将迭代该字典的键。在这里,您似乎想对这些值进行迭代,以便可以执行您所执行的操作或类似操作:

for engagements in engagement_by_account.values():
  for engagement in engagements:
    engagement['total_minutes_visited'] = float(engagement['total_minutes_visited'])

默认情况下,当您迭代字典(或
defaultdict
)时,您将迭代该字典的键。在这里,您似乎想对这些值进行迭代,以便可以执行您所执行的操作或类似操作:

for engagements in engagement_by_account.values():
  for engagement in engagements:
    engagement['total_minutes_visited'] = float(engagement['total_minutes_visited'])

为什么要在内部和外部循环上命名循环变量
engagement
?在这种情况下它可能会工作,但它不必要地容易混淆/出错。这不是你的问题,但这是代码气味。如果没有其他问题,您可以只命名外部的
约定
(复数)和内部的
约定
(单数),以避免混淆。谢谢,我知道这会让我们在复杂的代码中感到困惑,但那一个太简单了(至少我认为是这样)这就是我为什么不这样做的原因。为什么要在内部和外部循环上命名循环变量
engagement
?在这种情况下它可能会工作,但它不必要地容易混淆/出错。这不是你的问题,但这是代码气味。如果没有其他问题,您可以只命名外部的
约定
(复数)和内部的
约定
(单数),以避免混淆。谢谢,我知道这会让我们在复杂的代码中感到困惑,但那一个太简单了(至少我认为是这样)这就是我为什么不这么做的原因。它也可以工作,但实际上我想知道为什么其他代码(不带.values或.items)对defaultdict不起作用,但当我使用普通字典(如“dict={}”)尝试它时效果很好。你确定没有更改代码的其他部分吗?除了索引不存在的键外,
defaultdict
dict
在这种情况下的行为应该相同不幸的是,我不能发布屏幕截图,但我测试了好几次,当我删除.values时,唯一改变的是从.value案例中的dict到另一个案例中的字符串的啮合变量。它也可以工作,但实际上我想知道为什么其他代码(不带.values或.items)不适用于defaultdict,但当我使用普通字典(如“dict={})尝试它时效果很好您确定没有更改代码的其他部分吗?除了索引不存在的键外,
defaultdict
dict
在这种情况下的行为应该是相同的不幸的是,我不能发布屏幕截图,但我测试了几次,当我删除.values时,唯一改变的是从.value大小写上的dict到另一个大小写上的字符串的啮合变量。