2016-01-20 55 views
0

我有三個列表,(1)治療(2)藥物名稱和(3)藥物代碼符號。我正在嘗試爲14,700種治療方法分別確定相應的藥物代碼符號。我目前的做法是確定(2)中的任何名稱是否爲「in」(1),然後返回相應的(3)。但是,我返回了與14,700次治療相對應的藥物代碼符號的正確名單(正確長度)。代碼我寫的方法如下:在Python中使用嵌套for循環列表匹配

codes = pandas.read_csv('Codes.csv', dtype=str) 
codes_list = _codes.values.tolist() 

names = pandas.read_csv('Names.csv', dtype=str) 
names_list = names.values.tolist() 

treatments = pandas.read_csv('Treatments.csv', dtype=str) 
treatments_list = treatments.values.tolist() 

matched_codes_list = range(len(treatments_list)) 
for i in range(len(treatments_list)): 
    for j in range(len(names_list)): 
     if names_list[j] in treatments_list[i]: 
      matched_codes_list[i]=codes_list_text[j] 
print matched_codes_list 

爲我要去的地方錯了,將不勝感激任何建議!

+0

什麼是'codes_list_text'?我沒有看到它的定義。 –

+0

是每個「治療」藥品名單? – gariepy

+0

@scott hunter codes_list_text的意思是說codes_list –

回答

0

我不能說出你的期望。您應該用示例替換xxx_list代碼,因爲您似乎對csv閱讀沒有任何問題。

讓我們假設你這樣做了,你的結果看起來像這樣。

codes_list = ['shark', 'panda', 'horse'] 
names_list = ['fin', 'paw', 'hoof'] 
assert len(codes_list) == len(names_list) 
treatments_list = ['tape up fin', 'reverse paw', 'stand on one hoof', 'pawn affinity maneuver', 'alert wing patrol'] 

它聽起來就像你正試圖確定每個「處理」的「代碼」,假設代碼和名稱的數量是相同的(並指出一些映射)。您計劃使用名稱的存在來確定代碼。

我們可以壓縮在一起的名稱和代碼列表,以避免使用索引那裏,我們可以使用迭代在處理列表,而不是指數爲Python的可讀性

matched_codes_list = [] 
for treatment in treatment: 
    matched_codes = [] 
    for name, code in zip(names_list, codes_list): 
     if name in treatment: 
      matched_codes.append(code) 
    matched_codes_list.append(matched_codes) 

這將給像

assert matched_codes_list == [ 
    ['shark'],     # 'tape up fin' 
    ['panda'],     # 'reverse paw' 
    ['horse'],     # 'stand on one hoof' 
    ['shark', 'panda', 'horse'], # 'pawn affinity maneuver' 
    [],       # 'alert wing patrol' 
] 

請注意,用於執行此操作的方法非常慢(可能會導致誤報,請參閱第4項)。您將遍歷每個名​​稱/代碼對的所有處理描述的文本。

您可以使用類似'lookup = {name:code for name,code in zip(names_list,codes_list)}「或itertools.izip這樣的詞典來獲得較小的收益。否則可能需要更聰明的東西,可能將處理分成包含單詞的集合或將單詞映射爲多個代碼。

+0

謝謝,這有助於您!通過緩慢,你覺得這應該花多少時間?到目前爲止已經差不多一個小時了 –

+0

你可以很容易地添加一些東西來打印進度,或許是一個「。」。每2%完成一次。當前版本必須爲每個名稱遍歷所有治療的全文,如果有很多名字或長時間的治療,這可能很容易變慢,不能在沒有更多信息的情況下給出估計,對不起。 – Cireo