1

私は別のリスト内のすべてのpromocodeにリストに(OCRエラーが含まれる場合があります)各promocodeを比較するためのプログラムを構築しています(正しいpromocodesのリスト)TypeError例外:非ハッシュ「リスト」

予想される出力は、編集距離であります比較されているものとの編集距離が最小のプロモーションコード。

私のコード

import csv 
from nltk.metrics import distance 

with open("all_correct_promo.csv","rb") as file1: 
    reader1 = csv.reader(file1) 
    correctPromoList = list(reader1) 
    #print correctPromoList 

with open("all_extracted_promo.csv","rb") as file2: 
    reader2 = csv.reader(file2) 
    extractedPromoList = list(reader2) 
    #print extractedPromoList 

def find_min_edit(str_,list_): 
    nearest_correct_promos = [] 
    distances = {} 
    min_dist = 100 # arbitrary large assignment 
    for correct_promo in list_: 
     dist = distance.edit_distance(extracted,correct_promo,True) # compute Levenshtein distance 
     distances[correct_promo] = dist # store each score for real promo codes 
     if dist<min_dist: 
      min_dist = dist # store min distance 
    # extract all real promo codes with minimum Levenshtein distance 
    nearest_correct_promos.append(','.join([i[0] for i in distances.items() if i[1]==min_dist])) 
    return ','.join(nearest_correct_promos) # return a comma separated string of nearest real promo codes 

incorrectPromo = {} 
count = 0 
for extracted in extractedPromoList: 
    print 'Computing %dth promo code...' % count 
    incorrectPromo[extracted] = find_min_edit(extracted,correctPromoList) # get comma separated str of real promo codes nearest to extracted 
    count+=1 
print incorrectPromo 

の予想される出力

Computing 0th promo code... 
Computing 1th promo code... 
Computing 2th promo code... 
{'abc': 'abc', 'abd': 'abx,aba,abz,abc', 'acd': 'abx,aba,abz,abc'} 

しかし、私のコードが表示されている次のエラー

Computing 0th promo code... 

Traceback (most recent call last): 

    File "correctpromo_test4.py", line 31, in <module> 

    incorrectPromo[extracted] = find_min_edit(extracted,correctPromoList) # get 
comma separated str of real promo codes nearest to extracted 

File "correctpromo_test4.py", line 20, in find_min_edit 

    distances[correct_promo] = dist # store each score for real promo codes 

TypeError: unhashable type: 'list' 
+1

リストを辞書キーとして使用することはできません。 1つの簡単な修正は、リストからタプルに変更することです。 –

+0

サンプル入力を追加できますか?このコードは、これらの入力で私に役立ちます。 'extractedPromoList = ['abc'、 'acd'、 'abd']抽出されたプロモコードの#csvダミー correctPromoList = ['abc'、 'aba'、 'xbz' abz '、' abx ']#csvを実際のプロモーションコードdummy' –

答えて

0

あなたはリストのリストとしてCSVを読んでいます - 関数find_min_edit()は2番目の引数として文字列のリストを期待しています。あなたが渡しているのは文字列のリストです。

ソートでこのようなものをCSVファイルを読み出す方法を変更する - 代わり

with open("all_correct_promo.csv","rb") as file1: 
    reader1 = csv.reader(file1) 
    correctPromoList = list(reader1) 

をちょうどこの

with open("all_correct_promo.csv","rb") as file1: 
    reader1 = csv.reader(file1) 
    correctPromoList = [''.join(i) for i in reader1] 
    print correctPromoList 

は両方のためにこれを行ってください使用CSVは、それを並べ替えるでしょう...

関連する問題