字典:一个键的附加值也会被添加到其他键



我有一个36352行的excel大文件,其中包含入室盗窃的信息。每一行都包含事件发生地的日期和市镇名称。我正试图将这个数据集转换为每个市政当局的日历地图,说明一年中每天发生了多少入室盗窃案。

我首先创建了一个日历地图(字典),其中日期是关键,值是入室盗窃次数(初始化为0):{day1: 0, day2: 0}

接下来,我制作了另一本词典,其中的关键字是市政当局的名称,值是日历词典。

例如:

Dictionary['New York'] = {day1: 0, day2: 0, day3: 0}

此初始化工作正常。

我采取的下一步是逐行浏览我的数据集(写入content_split),将市政当局的名称和事件的日期作为关键字,并在值上加1:

Dictionary[name-in-column-14-of-excel-file][day-of-event] += 1

我把它写成一个循环:

for k in range(1,len(excelfile)): #for all rows in the excel file
    # datetime.datetime(year,month,day)
    d = datetime.datetime(int(content_split[k][9]),int(content_split[k][8]),int(content_split[k][7]))
    # Dictionary[name-of-municipality][timestamp-in-utc] += 1
    Municipality_dict[content_split[k][14]][calendar.timegm(d.timetuple())] += 1

如果我查一个市镇的日历字典,我会得到很高的数字(一个市一天发生176起入室盗窃案),而且不同市镇的地图是相同的。因此,我的市政钥匙似乎不起作用,但我不知道该怎么办。

有人知道我做错了什么吗?

编辑我如何创建词典:

# Open map containing the days
with open('days.csv') as f1:
  days_temp = f1.readlines()
alldays = []
# Get dd;mm;yy format to [dd, mm, yy] format
for day in days_temp:
   alldays.append(day.strip().split(';'))
Timestamp = {}
# Convert days into UTC codes
for i in range(len(alldays)):
d = datetime.datetime(int(alldays[i][2]),int(alldays[i][1]),int(alldays[i][0]))
# dictionary[UTC-time-code] = 0 (no burglaries occurred)
Timestamp[calendar.timegm(d.timetuple())] = 0
# Open file with names of municipalities
with open('file2.csv') as f2:
    municipalities_temp = f2.readlines()
municipalities_dict = {}  
# dictionary[name-of-municipality] = calendar
for instance in municipalities_temp:
    municipalities_dict[instance.strip()] = Timestamp

听起来,当您创建第二个字典时,其中的关键字是市政名称,每个关键字都被指定为对同一字典的引用。参见以下示例:

>>> test = {"x":"y"}
>>> test2 = test
>>> test["x"] = "foo"
>>> test2
{'x': 'foo'}
>>> 

请注意,test2["x"]在test更改时更改为foo,因为test2是对test的引用,而不是它自己的字典。解决方案

import copy
template_dict = {day1: 0, day2: 0, day3: 0}
Dictionary['New York'] = copy.deepcopy(template_dict)