嘿伙计我正在处理一个包含14列(部门ID,员工ID和一年中的几个月)的数据集,显示每个员工每个月工作的小时数。
我正在使用的功能需要为他/她的部门(作为一个整体)记录非零值(即营销中的John记录为零时)的特定月份记录零值的员工打印行。 5月份,当部门总计500小时,所以我们打印约翰的行。
我有两个辅助函数: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):
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
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
时功能,它提供了一个完全错误的输出,只有一个员工行打印80次:
[10017.0, 93454.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.6, 0.0] - beware : line 76 len(A[i]) 13 < len(row) 14
[10017.0, 93454.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.6, 0.0] - beware : line 77 len(A[i]) 13 < len(row) 14
[10017.0, 93454.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.6, 0.0] - beware : line 78 len(A[i]) 13 < len(row) 14
[10017.0, 93454.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.6, 0.0] - beware : line 79 len(A[i]) 13 < len(row) 14
[10017.0, 93454.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.6, 0.0] - beware : line 80 len(A[i]) 13 < len(row) 14
答案 0 :(得分:1)
findgaps
只会return
一次;在第一次调用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:
return compcols(A[i],X) # only ever returns once
相反,它应该是这样的:
def findgaps(A):
X = cost_center_sum(A)
for row in A:
if any(month < 0.00001 for month in row[2:]):
yield compcols(row, X)
这是一个&#34;发电机&#34;这将返回多个值。请注意,您不需要索引i
和j
- 它们只会使代码复杂化,您可以看到迭代对象本身时有多清楚。
接下来,compcols
正在报告&#34;警告&#34;第一项是否匹配。我认为它应该是:
def compcols(row, X):
for dept_row in X:
if row[0] == dept_row[0]:
for emp_month, dep_month in zip(row[2:], dept_row[2:])
if emp_month == 0 and dep_month != 0:
return row
else:
print "No match for department {0}.".format(row[0])