【问题标题】:Encapsulated OrderedDict in a Dict在字典中封装 OrderedDict
【发布时间】:2016-11-07 13:23:23
【问题描述】:

OrderedDict 封装到dict 时,会出现OrderedDict 未更新的问题。

目的是获得具有以下形式的字典:

{name1: OrderedDict( {year1:amount,year2:amount,...}), name2: OrderedDict( {year1:amount,year2:amount,...})}

但是在初始化第一个 temp_ord 之后,它不会进一步更新,因此第一个之后的每个名称的年份金额对都是相同的。

CSV 结构在列中:名称年份编号。我不确定这是循环错误还是因为封装了字典。

import csv
from collections import OrderedDict

def plot_names(file_name, names):
    temp_dict = {}
    temp_ord = OrderedDict({})
    with open(file_name) as csvfile:
        reader = csv.DictReader(csvfile)
        for name in names:
            for row in reader:
                if name == row["name"]:
                    temp_ord[row["year"]] = row["number"]
            temp_dict[name] = temp_ord
    return temp_dict

数据格式:

year    name    gender  number /n 1993  Abarna  f   1 /n 1993   Abetare f   1 /n 1993   Abir    f   1

【问题讨论】:

  • 你能显示你的数据吗?
  • 已更新。您会看到所有 last 数据,因为它们都引用同一个对象。移动temp_ord = OrderedDict()(不需要额外的字典)在循环内
  • @jonrsharpe 究竟在哪个循环中,你能提供固定循环吗?
  • 好吧,您希望哪个循环的每个项目都有一个新字典?这不是代码编写服务,您必须自己完成一些工作。
  • @jonrsharpe 好吧,我尝试将它放在两个循环中,这仍然给我两个错误:如果放在内部循环中,我会为每个名称得到空的 OrderedDict。如果放入外部循环中,我会在名字之后的每个地方得到一个空的 OrderedDict。在提供答案时,您至少可以参考您所指的循环,而不仅仅是参考“循环”,因此我之前的回答。

标签: python python-2.7 dictionary ordereddictionary


【解决方案1】:

问题是一个阅读器只能被消费一次(感谢@jonrsharpe)。

import csv
from collections import OrderedDict

def plot_names(file_name, names):
    temp_dict = {}
    for name in names:
            with open(file_name) as csvfile:
                reader = csv.DictReader(csvfile)
                temp_ord = OrderedDict({})
                for row in reader:
                    if name == row["name"]:
                        temp_ord[row["year"]] = row["number"]
                temp_dict[name] = temp_ord
    return temp_dict

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 2013-09-19
    • 2021-09-27
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2016-09-29
    相关资源
    最近更新 更多