Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中嵌套带有csv的字典,我需要减少或增加日期_Python_Loops_Csv_Dictionary - Fatal编程技术网

在python中嵌套带有csv的字典,我需要减少或增加日期

在python中嵌套带有csv的字典,我需要减少或增加日期,python,loops,csv,dictionary,Python,Loops,Csv,Dictionary,我很兴奋,因为我从朋友那里得到了一些提示。我正在尝试使用循环创建一个字典字典。我正在使用的csv的日期是2008-2014年,我将这些日期作为关键。csv如下所示: 年份、标题、字段、值 2014,Total Housing Units,49109 2014,Vacant Housing Units,2814 2014,Occupied Housing Units,46295 2013,Total Housing Units,47888 2013,Vacant Housing Units,421

我很兴奋,因为我从朋友那里得到了一些提示。我正在尝试使用循环创建一个字典字典。我正在使用的csv的日期是2008-2014年,我将这些日期作为关键。csv如下所示:
年份、标题、字段、值

2014,Total Housing Units,49109
2014,Vacant Housing Units,2814
2014,Occupied Housing Units,46295
2013,Total Housing Units,47888
2013,Vacant Housing Units,4215
2013,Occupied Housing Units,43673
2012,Total Housing Units,45121
2012,Vacant Housing Units,3013
2012,Occupied Housing Units,42108
2011,Total Housing Units,44917
2011,Vacant Housing Units,4213
2011,Occupied Housing Units,40704
2010,Total Housing Units,44642
2010,Vacant Housing Units,3635
2010,Occupied Housing Units,41007
2009,Total Housing Units,39499
2009,Vacant Housing Units,3583
2009,Occupied Housing Units,35916
2008,Total Housing Units,41194
2008,Vacant Housing Units,4483
2008,Occupied Housing Units,36711
这是我的密码:

import csv

denton_housing = {}
filename = 'denton_housing.csv'
key = 2014

with open(filename, 'r', encoding='utf8', newline='') as f:
    for row in csv.DictReader(f, delimiter=','):
        while key not in denton_housing:
            denton_housing[key] = {}
            denton_housing[key][row['title_field']] = int(row['value'])
            key-1
当我打印时,我得到:

{2014: {'Total Housing Units': 49109}}
太棒了!但我需要这个:

{2014: {'Total Housing Units': 49109}, {'Vacant Housing Units': 2814}, \    {'Occupied Housing Units': 46295}}

更重要的是,我需要它来循环,并为2013年、2012年、2011年、2010年、2009年和2008年执行相同的操作,但到此为止。

您可以使用
itertools.groupby
创建一个字典,其中每个键都是一年,存储一个包含
总住房单元数
空置住房单元数

import itertools
import csv
with open('filename.csv') as f:
   data = [[int(a), b, int(c)] for a, b, c in sorted(list(csv.reader(f))[1:], key=lambda x:int(x[0]))]

final_data = {a:dict(i[1:] for i in b) for a, b in itertools.groupby(data, key=lambda x:x[0])}
输出:

{2008: {'Total Housing Units': 41194, 'Vacant Housing Units': 4483, 'Occupied Housing Units': 36711}, 2009: {'Total Housing Units': 39499, 'Vacant Housing Units': 3583, 'Occupied Housing Units': 35916}, 2010: {'Total Housing Units': 44642, 'Vacant Housing Units': 3635, 'Occupied Housing Units': 41007}, 2011: {'Total Housing Units': 44917, 'Vacant Housing Units': 4213, 'Occupied Housing Units': 40704}, 2012: {'Total Housing Units': 45121, 'Vacant Housing Units': 3013, 'Occupied Housing Units': 42108}, 2013: {'Total Housing Units': 47888, 'Vacant Housing Units': 4215, 'Occupied Housing Units': 43673}, 2014: {'Total Housing Units': 49109, 'Vacant Housing Units': 2814, 'Occupied Housing Units': 46295}}

您可以使用
itertools.groupby
创建一个字典,其中每个键都是一年,存储一个字典,其中包含
总住房单元数
空置住房单元数

import itertools
import csv
with open('filename.csv') as f:
   data = [[int(a), b, int(c)] for a, b, c in sorted(list(csv.reader(f))[1:], key=lambda x:int(x[0]))]

final_data = {a:dict(i[1:] for i in b) for a, b in itertools.groupby(data, key=lambda x:x[0])}
输出:

{2008: {'Total Housing Units': 41194, 'Vacant Housing Units': 4483, 'Occupied Housing Units': 36711}, 2009: {'Total Housing Units': 39499, 'Vacant Housing Units': 3583, 'Occupied Housing Units': 35916}, 2010: {'Total Housing Units': 44642, 'Vacant Housing Units': 3635, 'Occupied Housing Units': 41007}, 2011: {'Total Housing Units': 44917, 'Vacant Housing Units': 4213, 'Occupied Housing Units': 40704}, 2012: {'Total Housing Units': 45121, 'Vacant Housing Units': 3013, 'Occupied Housing Units': 42108}, 2013: {'Total Housing Units': 47888, 'Vacant Housing Units': 4215, 'Occupied Housing Units': 43673}, 2014: {'Total Housing Units': 49109, 'Vacant Housing Units': 2814, 'Occupied Housing Units': 46295}}

这里的诀窍是,您不希望在每个值中都有一个
dict
,而是希望有一个
dict
s的
列表。(实际上,如果您想要指定的确切输出,可以使用
元组
,但我假设您会喜欢
列表

因此,与此相反:

denton_housing[key] = {}
denton_housing[key][row['title_field']] = int(row['value'])
…这样做:

denton_housing[key] = []
new_dict = {}
new_dict[row['title_field']] = int(row['value'])
denton_housing[key].append(new_dict)
现在,不是设置

而不是这个:

denton_housing[key] = {}
denton_housing[key][row['title_field']] = int(row['value'])
…这样做:

denton_housing[key] = []
new_dict = {}
new_dict[row['title_field']] = int(row['value'])
denton_housing[key].append(new_dict)
另外,请始终执行第二部分,而不仅仅是当
键不在
时。(另外,您可能希望
if
在那里,而不是
while


您可以从这里简化事情,并构建一个更好的数据结构(您有三个单键dict;一个具有多个键的dict不是更好吗?)等等。但希望这对您来说很容易理解,这样您就可以摆脱束缚,从那里开始变得狂野。

这里的诀窍是,您不希望在每个值中都有一个
dict
,您需要一个
列表
dict
s。(实际上,如果您想要指定的确切输出,可以使用
元组
,但我假设您会喜欢
列表

In[2]: import csv
  ...: from collections import defaultdict
  ...: 
  ...: denton_housing = defaultdict(dict)
  ...: filename = 'denton_housing.csv'
  ...: key = 2014
  ...: 
  ...: with open(filename, 'r', encoding='utf8', newline='') as f:
  ...:     for row in csv.DictReader(f):
  ...:         denton_housing[row['year']].update({
  ...:             row['title_field']: int(row['value'])
  ...:         })
  ...: 
In[3]: import json
In[4]: print(json.dumps(denton_housing, indent=4))
{
    "2014": {
        "Total Housing Units": 49109,
        "Vacant Housing Units": 2814,
        "Occupied Housing Units": 46295
    },
    "2013": {
        "Total Housing Units": 47888,
        "Vacant Housing Units": 4215,
        "Occupied Housing Units": 43673
    },
    "2012": {
        "Total Housing Units": 45121,
        "Vacant Housing Units": 3013,
        "Occupied Housing Units": 42108
    },
    "2011": {
        "Total Housing Units": 44917,
        "Vacant Housing Units": 4213,
        "Occupied Housing Units": 40704
    },
    "2010": {
        "Total Housing Units": 44642,
        "Vacant Housing Units": 3635,
        "Occupied Housing Units": 41007
    },
    "2009": {
        "Total Housing Units": 39499,
        "Vacant Housing Units": 3583,
        "Occupied Housing Units": 35916
    },
    "2008": {
        "Total Housing Units": 41194,
        "Vacant Housing Units": 4483,
        "Occupied Housing Units": 36711
    }
}
因此,与此相反:

denton_housing[key] = {}
denton_housing[key][row['title_field']] = int(row['value'])
…这样做:

denton_housing[key] = []
new_dict = {}
new_dict[row['title_field']] = int(row['value'])
denton_housing[key].append(new_dict)
现在,不是设置

而不是这个:

denton_housing[key] = {}
denton_housing[key][row['title_field']] = int(row['value'])
…这样做:

denton_housing[key] = []
new_dict = {}
new_dict[row['title_field']] = int(row['value'])
denton_housing[key].append(new_dict)
另外,请始终执行第二部分,而不仅仅是当
键不在
时。(另外,您可能希望
if
在那里,而不是
while


您可以从这里简化事情,并构建一个更好的数据结构(您有三个单键dict;一个具有多个键的dict不是更好吗?)等等。但希望这对您来说很容易理解,这样您就可以从中解脱出来,并且可以从中发疯。

您显示为所需结果的数据结构不是有效的python。您可能需要的是一个字典,其中的值是字典列表。这看起来像{2014:[{'总住房单元数:49109},{'空置住房单元数:2814],2015:[…]}请注意额外的方括号。变化很小,但差别很大!您是想要一个将2014映射到三个单键dict的元组的dict,如您所示,还是想要一个将2014映射到三个键的dict的dict,这可能会更有用?您所显示的作为所需结果的数据结构不是有效的python。您可能会问:nt是一个字典,其中的值是字典列表。它看起来像{2014:[{'Total Housing Units':49109},{'Emptant Housing Units':2814],2015:[…]}注意额外的方括号。变化很小,但差别很大!您是想要一个将2014映射到三个单键dict的元组的dict,如您所示,还是想要一个将2014映射到三个键的dict的dict,哪一个可能更有用?当我带来最终的数据时,我似乎明白了这一点:
ValueError:invalid literal for int()以10为基数:'year'
@ArchivistG,您的csv文件中可能会有一个额外的列。我根据您随问题一起发布的数据进行了测试。您能否澄清一下您的csv文件中可能有哪些列?它只有3个'year'、'title_field'和'value'@ArchivistG啊,我刚刚意识到该文件包含一个标题行。请查看我最近的edit、 这是我的错。我没有包含标题。啊。对不起。我在带来最终数据时似乎得到了这个信息:
ValueError:invalid literal for int()以10为基数:'year'
@ArchivistG,您的csv文件中可能会有一个额外的列。我根据您随问题一起发布的数据进行了测试。您能否澄清一下您的csv文件中可能有哪些列?它只有3个'year'、'title_field'和'value'@ArchivistG啊,我刚刚意识到该文件包含一个标题行。请查看我最近的edit、 那是我的错。我没有包括标题。啊。对不起。
In[2]: import csv
  ...: from collections import defaultdict
  ...: 
  ...: denton_housing = defaultdict(dict)
  ...: filename = 'denton_housing.csv'
  ...: key = 2014
  ...: 
  ...: with open(filename, 'r', encoding='utf8', newline='') as f:
  ...:     for row in csv.DictReader(f):
  ...:         denton_housing[row['year']].update({
  ...:             row['title_field']: int(row['value'])
  ...:         })
  ...: 
In[3]: import json
In[4]: print(json.dumps(denton_housing, indent=4))
{
    "2014": {
        "Total Housing Units": 49109,
        "Vacant Housing Units": 2814,
        "Occupied Housing Units": 46295
    },
    "2013": {
        "Total Housing Units": 47888,
        "Vacant Housing Units": 4215,
        "Occupied Housing Units": 43673
    },
    "2012": {
        "Total Housing Units": 45121,
        "Vacant Housing Units": 3013,
        "Occupied Housing Units": 42108
    },
    "2011": {
        "Total Housing Units": 44917,
        "Vacant Housing Units": 4213,
        "Occupied Housing Units": 40704
    },
    "2010": {
        "Total Housing Units": 44642,
        "Vacant Housing Units": 3635,
        "Occupied Housing Units": 41007
    },
    "2009": {
        "Total Housing Units": 39499,
        "Vacant Housing Units": 3583,
        "Occupied Housing Units": 35916
    },
    "2008": {
        "Total Housing Units": 41194,
        "Vacant Housing Units": 4483,
        "Occupied Housing Units": 36711
    }
}