嘿,伙计们,我正在处理一个数据集,它有14列(部门ID、员工ID和一年中的月份),显示每个员工每个月工作了多少小时。我正在使用的函数需要打印出在特定月份记录零值的员工的行,而他/她的部门(作为一个整体)记录了一个非零值(例如,市场部的John在5月份记录了零小时,而部门总数为500小时,因此我们打印John的行)。我有两个辅助函数:cost_center_sum(A),它接受2D数据数组(组织为列表的列表),并以列表的列表的形式查找每个部门的累计工时。第二个辅助函数compcols(row, A)将"row"的部门ID与数据集A中相应的行进行匹配,并检查"row"中特定月份的零值是否与A中匹配的行中相同月份的零值相对应。我尝试将这两个函数编译到函数findgaps(A)中,该函数将打印一个员工的员工信息,该员工在部门记录非零值的月份记录了零。
下面是我上面描述的函数的代码:
def compcols(row, A):
for i in range(len(A)):
if len(A[i]) < len(row):
raise Exception("Line %d len(A[i]) %d - len(row) %d"
%(i, len(A[i]), len(row)))
for j in range(len(row)):
if row[0]==A[i][0]:
if row[j]==0 and A[i][j]!=0:
print row
NUMBER_OF_MONTHS = 12
def cost_center_sum(A):
dep = dict()
for row in A:
if row[0] not in dep:
dep[row[0]] = [0.0 for x in xrange(NUMBER_OF_MONTHS)]
for i in xrange(NUMBER_OF_MONTHS):
dep[row[0]][i] += row[i+2]
ret = list()
for department in sorted(dep.iterkeys()):
x = [department]
x.extend(dep[department])
ret.append(x)
return ret
def findgaps(A):
X = cost_center_sum(A)
for i in range(len(A)):
for j in range(len(A[0])):
if A[i][j] < 0.00001:
return compcols(A[i],X)
我已经测试了其他函数,它们似乎做得相当好(compcol中有一个小错误,多次打印同一行),但是当我使用findgaps函数时,我得到以下错误:
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
findgaps(my_list)
File "C:UsersnbhambiDesktopAmgenProgram.py", line 38, in findgaps
return compcols(A[i],X)
File "C:UsersnbhambiDesktopAmgenProgram.py", line 7, in compcols
%(i, len(A[i]), len(row)))
Exception: Line 0 len(A[i]) 13 - len(row) 14
任何帮助都将非常感激!
编辑-问题要简单得多pub是由前面的post引起的错误
这一切都是愚蠢的混乱
所发生的是正常的:如果A[i]短于row, if len(A[i]) < len(row): raise Exception("...")
精确地抛出错误。我想你宁愿节目继续下去。
所以你可以这样做(简单的警告而不是错误):
def compcols(row, A):
for i in range(len(A)):
if len(A[i]) < len(row):
print row, (" - beware : line %d len(A[i]) %d < len(row) %d"
%(i, len(A[i]), len(row)))
else:
if row[0]==A[i][0]:
for j in range(len(row)):
if row[j]==0 and A[i][j]!=0:
print row
break
我还在最内层循环的末尾添加了一个断点,以便只打印一次row
,并将测试row[0]==A[i][0]
拉出该循环,以避免无用的测试。
回到实际解决方案
因为上面引用的帖子,我只试图修复异常问题。但是问题要简单得多:通过构造,cost_center_sum
生成一个大小为13的列表,findgaps
和compcols
将其与大小为14的列表进行比较!事实上,如果a中有一行没有14个值,那么在compcols
之前调用的cost_center_sum
中就会出现错误。
让所有的工作:
compcols
应该只比较月份值,而不是内部循环中的第一个字段,并在它们所在的位置获取这些值:def compcols(row, A): for i in range(len(A)): if row[0]==A[i][0]: for j in range(1, len(row)): if row[j]==0 and A[i][j + 1]!=0: print row break
findgaps
应该在匹配后停止调用compcols
:def findgaps(A): X = cost_center_sum(A) for i in range(len(A)): for j in range(len(A[0])): if A[i][j] < 0.00001: compcols(A[i],X) break