1

使用:Python 2.4

現在、2つのリストを反復処理し、両方のリストに存在する2つの要素に基づいて一致させるネストされたforループがあります。一致するものが見つかると、それはr120Finalリストの要素であり、「r120Delta」という新しいリストに入れられます。

for r120item in r120Final:
    for spectraItem in spectraFinal:
    if(str(spectraItem[0]) == r120item[2].strip()) and (str(spectraItem[25]) == r120item[10]):
        r120Delta.append(r120item)
        break

問題は、これが非常に遅く、リストがそれほど深くないことです。R120は約64,000回線で、Spectraは約150,000回線です。

r120Finalリストはネストされた配列であり、次のようになります。

r120Final[0] = [['xxx','xxx','12345','xxx','xxx','xxx','xxx','xxx','xxx','xxx','234567']]
...
r120Final[n] = [['xxx','xxx','99999','xxx','xxx','xxx','xxx','xxx','xxx','xxx','678901']]

スペクトルの最終リストは基本的に同じで、ネストされた配列であり、次のようになります。

spectraFinal[0] = [['12345','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','234567']]
...
spectraFinal[0] = [['99999','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','678901']]

最後に、「r120Delta」の理由は、r120Finalとr120Deltaの間でリスト差分を実行し、一致しなかったr120データ要素を取得できるようにするためです。これは私がこのタスクのために定義した関数であり、繰り返しますが、遅いです:

def listDiff( diffList, completeList ):
    returnList = []
        for completeItem in completeList:
            if not completeItem  in diffList:
                returnList.append(completeItem)
    return returnList

基本的に、私はPythonに精通していますが、決して専門家ではありません。これをスピードアップする方法を教えてくれる専門家を探しています。どんな助けでも大歓迎です!

4

1 に答える 1

2
spectra_set = set((str(spectraItem[0]), str(spectraItem[25])) for spectraItem in spectraFinal)

returnList = []
for r120item in r120Final:
    if (r120item[2].strip(), r120item[10]) not in spectra_set:
       returnList.append(r120item)

これにより、に一致しなかったすべてのアイテムが追加されますreturnList

あなたは(あなたが本当に望むなら)一行でそれをすることができます

returnList = [r120item for r120item in r120Final 
                 if (r120item[2].strip(), r120item[10]) not in 
                     set((str(spectraItem[0]), str(spectraItem[25])) 
                         for spectraItem in spectraFinal)]

あなたが完全を必要とするならばspectraItem

spectra_dict = dict(((str(spectraItem[0]), str(spectraItem[25])), spectraItem) for spectraItem in spectraFinal)
returnList = []
for r120item in r120Final:
    key = (r120item[2].strip(), r120item[10])
    if key not in spectra_dict:
        returnList.append(r120item)
    else:
        return_item = some_function_of(r120item, spectra_dict[key])
        returnList.append(return_item)
于 2011-08-04T17:32:41.677 に答える