2014-06-25 191 views
0

嗨,我正在處理一個數據集,它有14列(部門編號,員工編號和一年的月份),顯示每個員工工作多少小時每個月。查找員工數據二維數組和二維數組二維數組之間的差距

我正在使用的函數需要打印出員工的行,當他/她的部門(整體)記錄一個非零值時(例如,在市場營銷記錄爲零5月份的時間爲500小時,所以我們打印約翰的行)。

我有兩個幫助函數:cost_center_sum(A)它接收二維數據數組(組織爲列表的列表),並將每個部門的累積小時數作爲列表的列表。第二個輔助函數compcols(row, A)將部門ID「row」與數據集合A中的相應行匹配,並檢查特定月份的「行」中的零值是否對應於該行中同一月份的零行在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 

回答

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) 

這是一個「發電機」,將返回多個值。請注意,您不需要指數ij - 它們只會使代碼複雜化,並且您可以看到在迭代對象本身時它有多清晰。

接下來,compcols正在報告「警告」第一項是否匹配。我認爲它應該是:

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])