用Python从excel映射数据

用Python从excel映射数据,python,mapping,xlrd,Python,Mapping,Xlrd,我正在使用xlrd从xls电子表格中读取数据。首先,我收集包含所需数据的列的索引(在每个实例中可能并不总是在同一列中): 现在我有三个列表,我需要使用它们将数据写入新工作簿。行中的值是相关的。因此,一个列表中项目的索引对应于其他列表中项目的相同索引 amr\u列表具有重复的字符串值。例如: ['4006BA','4006BA','4007AC','4007AC','4007AC'] pssr\u列表始终与amr\u列表共享相同的值,但具有其他信息: ['4006BA(1)','4006BA(2

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

现在我有三个列表,我需要使用它们将数据写入新工作簿。行中的值是相关的。因此,一个列表中项目的索引对应于其他列表中项目的相同索引

amr\u列表
具有重复的字符串值。例如:

['4006BA','4006BA','4007AC','4007AC','4007AC']
pssr\u列表
始终与
amr\u列表
共享相同的值,但具有其他信息:

['4006BA(1)','4006BA(2)','4007AC(1)','4007AC(2)','4007AC(3)']
最后,
in-service_列表
可能包含也可能不包含可变日期(从excel读取):

这是我希望从数据中得到的结果:

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

但我很难弄明白如何才能轻松到达那里。提前感谢。

查看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_列表排序

另一种办法是:

combined={}
for k, v in zip(amr_list, zip(pssr_list, inservice_list)):
    combined.setdefault(k, []).append(v)
这不需要对您的输入进行排序。

也许这有助于:

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

这将以您需要的格式打印数据。

谢谢您的输入!我发现这与@retracile第二个示例的作用基本相同。谢谢。是的,@retracile的第二个例子比我的好得多。如果您正在处理大量数据,可以使用“izip”而不是“zip”。这将创建一个生成器,而不是计算所有列表,在某些情况下,“zip”可以更快。导入为“从itertools导入izip”。Itertools是一个不错的软件包,请看:
combined={}
for k, v in zip(amr_list, zip(pssr_list, inservice_list)):
    combined.setdefault(k, []).append(v)
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