2014-01-22 92 views
3

我正在嘗試將值插入到列表中,該列表通過首先標識匹配來打包到字典中。如果我有一本字典這樣:Python:根據匹配插入到字典中的列表中

{'12633': ['11-Mar-11', '26-Apr-11'], '11359': [], '11458': ['6-Aug-10'], '16335': ['29-May-13'], '11101': []} 

什麼我正在試圖做的是讀了由線文件,如果該鍵在我的字典裏存在識別。然後確定值是否匹配或存在於字典鍵返回的列表中。此時,我想從列表中匹配值旁邊的行中插入一個值。

with open('Pfa.csv', 'r') as f: 
    for line in f: 
     #split the line up into individual element - it's a csv file 
     line = line.strip('/n') 
     splitline = line.split(',') 
     #check if the value in the file exists as a key in the dictionary 
     if splitline[0] in Ndates: 
      #iterate over the list in the dictionary 
      for item in Ndates[splitline[0]]: 
       #check if the item within the dictionary list is within this line in the file 
       if item == splitline[1]: 
        #insert a vale from the file next to the value in the list within the dictionary 
        Ndates[splitline[0]].insert(Ndates[splitline[0]].index(item), splitline[4].strip('\n')) 

不幸的是,它似乎被卡住了循環出於某種原因,我不能識別數據。只需將值附加到列表中,但它很麻煩,並且具有接近3k的值,我不想親自去做。

任何幫助非常感謝,讓我知道我要去哪裏錯了。我覺得我這樣做效率很低,但我願意學習。

回答

3

您正在修改列表,因爲您正在迭代它。

一個補丁修復:

 #iterate over the list in the dictionary 
     for item in Ndates[splitline[0]][:]: 

這個副本之前迭代的列表。

但我建議重構:

import csv 

with open('Pfa.csv') as f: #'r' is default 
    for row in csv.reader(f): 
     key = row[0] 
     try: 
      values = Ndates[key] 
      i = values.index(row[1]) 
     except (KeyError, ValueError): 
      pass 
     else: 
      values.insert(i, row[4]) #this will insert *before* the match; use i + 1 insert *after* 
+1

非常感謝你。你的解決方案效果很好,我真的很喜歡它可以大大減少它。我有一種感覺,在迭代時修改列表是問題所在,但不知道在哪裏修復它。再次感謝你。 – ryfi

相關問題