1

我正在使用 xlrd 从 xls 电子表格中读取数据。首先,我收集包含我需要的数据的列的索引(在每个实例中可能并不总是在同一列中):

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)','')] }

但是我很难弄清楚到达那里的简单方法。提前致谢。

4

2 回答 2

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

这将以您正在寻找的格式打印您的数据。

于 2011-11-16T18:08:12.283 回答
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)

这不需要对您的输入进行排序。

于 2011-11-16T17:50:16.020 回答