2011-11-16 109 views
1

我正在使用xlrd從xls電子表格讀取數據。首先,本人收集的,其中包含我需要的(不一定是在同一列的每個實例)的數據列的索引:使用Python映射excel中的數據

amr_list, pssr_list, inservice_list = [], [], [] 
for i in range(sh.ncols): 
    for j in range(sh.nrows): 
     if 'amrprojectnumber' in sh.cell_value(j,i).lower(): 
      amr_list.append(sh.cell_value(j,i)) 
     if 'pssrnumber' in sh.cell_value(j,i).lower(): 
      pssr_list.append(sh.cell_value(j,i)) 
     if 'inservicedate' in sh.cell_value(j,i).lower(): 
      inservice_list.append(sh.cell_value(j,i)) 

現在我有三個列表,我需要用寫作數據添加到新的工作簿。一行中的值是相關的。因此,一個列表中某個項目的索引對應於其他列表中項目的相同索引。

amr_list具有重複的字符串值。例如:

['4006BA','4006BA','4007AC','4007AC','4007AC'] 

pssr_list總是共享相同的值作爲amr_list但是具有附加的信息:

['4006BA(1)','4006BA(2)','4007AC(1)','4007AC(2)','4007AC(3)'] 

最後,inservice_list可以或可以不包含可變日期(如從Excel讀取) :

[40780.0, '', 40749.0, 40764.0, ''] 

這是我從數據想要的結果:

amr = { '4006BA':[('4006BA(1)',40780.0),('4006BA(2)','')], '4007AC':[('4007AC(1)',40749.0),('4007AC(2)',40764.0),('4007AC(3)','')] } 

但是我很難弄清楚如何簡單的方法到達那裏。提前致謝。

回答

1

直視itertools.groupby和

zip(amr_list, pssr_list, inservice_list) 

對於您的情況:

dict((x,list(a[1:] for a in y)) for x,y in 
    itertools.groupby(zip(amr_list, pssr_list, inservice_list), lambda z: z[0])) 

注意,這裏假設你的輸入由amr_list排序。

另一種方法是:

combined={} 
for k, v in zip(amr_list, zip(pssr_list, inservice_list)): 
    combined.setdefault(k, []).append(v) 

不需要你的輸入進行排序。

+0

感謝您的幫助! – ionalchemist

2

也許這可以幫助:

A = ['4006BA','4006BA','4007AC','4007AC','4007AC'] 
B = ['4006BA(1)','4006BA(2)','4007AC(1)','4007AC(2)','4007AC(3)'] 
C = [40780.0, '', 40749.0, 40764.0, ''] 

result = dict() 
for item in xrange(len(A)): 
    key = A[item] 
    result.setdefault(key, []) 
    result[key].append((B[item], C[item])) 

print result 

這將打印您的格式,你正在尋找的數據。

+0

感謝您的輸入!我發現這基本上和@retracile第二個例子一樣。欣賞它。 – ionalchemist

+0

是的,@retracile的第二個例子比我的要好得多。如果您正在處理大量數據,則可以使用「izip」而不是「zip」。這將創建一個生成器,而不是計算所有列表,在某些情況下,「zip」可能更快。導入是「從itertools導入izip」。 Itertools是一個很好的包,看看:http://docs.python.org/library/itertools.html – krenel00