【问题标题】:Nested dictionary in a loop循环嵌套字典
【发布时间】:2017-07-22 11:17:44
【问题描述】:

我有一个看起来像这样的 CSV 文件: 它显示了 4 个国家从 1980 年到 2014 年的用电量。我正在尝试创建一个嵌套字典,例如 consumption['United States'][1980] 将返回正确的值。我有一个包含整数年列表的数组,我正在尝试创建这样的字典:

 file = open('power dataset.csv', 'r')

years = list(range(1980, 2015))

consumption = {}
generation = {}

generation = False

for line in file:

    if("Nuclear" in line):
        break

    split = line.split(",")

    if split[0] == "Generation":
        generation = True

    if  "Egypt" == split[0] or split[0] == "Germany" or split[0] == "Netherlands" or split[0] == "United States":

        values = split[2:]

        if not generation:

            i = 0

            for year in years:
                country = split[0]
                consumption[country] = {year: values[i]}
                i = i+1

其中 values 是一个包含相应年份值的数组。我遇到的问题是字典最终只包含一年和一个值(这是最后一个值)。因此,如果我尝试打印 consumption['United States'][1980] 之类的内容,则会出现错误,因为字典中没有 1980 的条目,只有 2014。

我觉得我错过了一些相当简单的东西,但我不能完全理解它。

Here 是整个 CSV 文件。

【问题讨论】:

  • 没有看到您如何声明split、country 和consumption,我们无能为力
  • 发布了更多代码。
  • 您不使用 Pandas 有什么特别的原因吗?那会更合适
  • @tobias_k 哦,我的错,我尝试更改该行进行测试。这是没有错误的。
  • @Swailem95 这个版本还有只显示一个字典的问题吗?

标签: python csv dictionary


【解决方案1】:

问题似乎在于:

for year in years:
    consumption[country] = {year: values[i]}

您在循环的每次迭代中覆盖 consumption[country] 的先前值。

试试这个:

if country in ("Egypt", "Germany", "Netherlands", "United States"):
    if not generation:
        consumption[country] = {year: vals for year, vals in zip(years, values)}

使用zip的字典理解的分步分解示例:

>>> years = [1980, 1981, 1982, 1983]
>>> values = [1, 2, 3, 4]
>>> zip(years, values)
[(1980, 1), (1981, 2), (1982, 3), (1983, 4)]
>>> {year: vals for year, vals in zip(years, values)}
{1980: 1, 1981: 2, 1982: 3, 1983: 4}

或者,您可以在内部循环之前将consumption[country] 初始化为consumption[country] = {},然后在编辑之前在原始代码中使用consumption[country][year] = values[i]。

【讨论】:

  • 您介意解释一下这是做什么的吗?另外,如果年份总是不同的,如何覆盖?
  • 啊酷,不知道 zip 功能 - 是的,重置是故意的。虽然我知道您的解决方案有效,但我仍在试图弄清楚为什么这些值会被覆盖,即使年份是独一无二的,它应该有效,但它没有。
  • @Swailem95 是的,岁月是独一无二的,但你覆盖整个consumption[country] dict。
  • @Swailem95 当您编写consumption[country] = {year: values[i]} 时,它会完全替换字典条目consumption[country]。您的意思是将新值添加为 consumption[country][year] = values[i]'. It is the difference between a = [val]` 和 a.append(val)
猜你喜欢
  • 2022-06-15
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2021-05-30
  • 2021-07-16
  • 2018-07-13
  • 1970-01-01
相关资源
最近更新 更多