我是python的新手,并且一直致力于解析excel电子表格。我正在尝试确定与一系列日期中的特定分区相关的累计值。
我有一种感觉,我不能正确理解逻辑流程,因为无论我如何编写它,我都会最终得到一个完全相同的值字典。在这一点上,我没有直觉为什么它是错的,所以不是写它周围,我想面对它。
hoursAllocationDict看起来像:
5-21-16
Zoning1: 0
Zoning2: 0
Zoning3: 0
5-22-16
Zoning1: 0
etc...
我的rawData看起来像一个列表列表:
[0] NAME, data, data, data, DATE, data, HOURS, data, ZONING, data, data, data, etc.
[1] NAME, data, data, data, DATE, data, HOURS, data, ZONING, data, data, data, etc.
[2] NAME, data, data, data, DATE, data, HOURS, data, ZONING, data, data, data, etc.
我为此特定任务运行的代码块如下所示:
#Iterate over all dates - date is a tuple with 0 index being the date and 1 being a dict of zonings
for date in hoursAllocationDict.iteritems():
#Iterate over each row
for row in rawData:
#If cell is not empty or blank AND if date cell equals iterator date
if rawData[row][23] and rawData[row][9] == date[0]:
#Use re.search to match possible zoning in zoning column (found in string of otherwise irrelevant data)
if findZoningInCell(rawData[row][23], zoningsDict):
#Store whatever subjoining we find
subZoning = findZoningInCell(rawData[row][23], zoningsDict)
#rawData[row][18] references a value of hours related to zoning
#Accumulate x.x hrs in hoursAllocationDict -> date -> subjoining
hoursAllocationDict[rawData[row][9]][subZoning] += rawData[row][18]
hoursAllocationDict的最终状态如下:
'10-29-15' : 'Zoning1': 52.0, 'Zoning2': 100.08333333333333, 'Zoning3': 128.0, 'Zoning4': 594.0, etc...
'10-30-15' : 'Zoning1': 52.0, 'Zoning2': 100.08333333333333, 'Zoning3': 128.0, 'Zoning4': 594.0, etc...
'10-31-15' : 'Zoning1': 52.0, 'Zoning2': 100.08333333333333, 'Zoning3': 128.0, 'Zoning4': 594.0, etc...
....
....
所以我每次迭代都会以某种方式更新字典中所有键的所有值,但我只是看不清楚。我已经重写了几次,现在可以利用了。
答案 0 :(得分:0)
我想出了答案。
此段之前的代码是:
#Set structure of hoursAllocationDict
#Date:
# Zoning1: 0
# Zoning2: 0
for date in uniqueDateList:
hoursAllocationDict[date] = zoningsDict
查看Python如何处理赋值(来自8.17“copy”):
Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项目的集合,有时需要一个副本,因此可以更改一个副本而不更改另一个副本。
将上述代码更改为以下代码解决了问题:
from copy import copy
....
for date in uniqueDateList:
hoursAllocationDict[date] = copy(zoningsDict)