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

Python 字典:一个键的附加值也会添加到其他键,python,dictionary,key,Python,Dictionary,Key,我有一个36352行的大型excel文件,其中包含盗窃信息。每行包含事件发生地的日期和城市名称。我正试图将这个数据集转换成每个市镇的日历地图,说明一年中每天有多少起盗窃案 我首先创建了一个日历地图字典,其中日期是键,值是初始化为0:{day1:0,day2:0}的入室盗窃数量 接下来,我制作了另一个字典,其中键是市镇的名称,值是日历字典 例如: 此初始化工作正常 我采取的下一步是逐行检查写入content_split的数据集,将市政府名称和事件日期作为键,并在值中添加1: Dictionary[

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

我首先创建了一个日历地图字典,其中日期是键,值是初始化为0:{day1:0,day2: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
如果我查一下1个城市的日历字典,我会发现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)

你是如何创建这些词典的?您正在共享引用,并且只有一个字典,而不是单独的对象;M_D[‘纽约’]=D;M_D['Boston']=D。。。,你会看到你得到的结果。我编辑了我原来的帖子。起初我不理解“分享参考资料”部分,但现在有了厄尔沃尔顿的回答,我明白你的意思了@乔琳。此外,您可以使用template_dict=lambda:{day1:0,day2:0,day3:0}来代替复制,然后将其用作字典['newyork']=template_dict,假设这些键应该是'day1'、'day2'和'day3'
import copy

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