2011-11-16 103 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