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

これで、新しいブックにデータを書き込むために使用する必要のある3つのリストができました。行の値は関連しています。したがって、1つのリスト内のアイテムのインデックスは、他のリスト内のアイテムの同じインデックスに対応します。

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 に答える