2012-08-09 72 views
1

我是一個初學者。我寫了一個腳本,輸入1000萬個條目的輸入列表(形式爲:b,其中a和b是字母數字)。Python腳本創建字典時,爲每個字典的鍵,有多個值(300條目)列表

現在我想從這些條目創建一本詞典。對於很多列表條目,第二部分(在冒號後面)是常見的。 (例如a:b,f:b,k:b - 在這種情況下,我的密鑰將是b,值將是列表[a,f,k])。

但不知怎的我的腳本被擊中。我可以從日誌中看到腳本被觸發並且日誌大小沒有增加。 (對於我的字典中的每個鍵,都有一個大小在400到500之間的列表。這可能是一個問題嗎?)

如果我的輸入列表包含較少的項目,我的腳本正常工作。

名單的名字是比賽

print 'match2 list: %s' % match2 # it shows the 10 million entries in form of a:b as expected 
for i in xrange(len(match2)): 
    print 'Before Splitted variable : %s' % match2[i] # this print is for information 
    templist = re.split(':', '%s' % match2[i]) 
    print 'Splitted list : %s' % templist # this print is for information 
    length3 = len(templist) 
    print "Length3 :%d" %length3 
    key1 = templist[1] 
    value1 = templist[0] 
    if example.has_key(key1): 
     example[key1].append(value1) 
    else: 
     example[key1] = value1 

請給你的建議。

+0

該代碼看起來不錯。 。 。有點醜陋和低效率,但罰款;)我會添加一些東西打印出來,並檢查它是否總是失敗在同一點 - 可能是您的輸入數據或一些周圍的邏輯問題。 – ernie 2012-08-09 18:03:43

+0

它與你所問的問題無關,但我認爲're.split'在這裏是過度殺傷。你可以做'templist = match2 [i] .split(':',maxsplit = 1)',這樣可以保證'len(templist)== 2'的好處,因爲最多隻有一次分割。 – 2012-08-09 18:29:00

+0

如果你知道你的列表項總是有一個':',並且執行'value1,key1 = match2 [i] .split(':',maxsplit = 1)',你甚至可以更進一步。 – 2012-08-09 18:30:12

回答

2

我懷疑問題就在這裏:

if example.has_key(key1): 
    example[key1].append(value1) 
else: 
    example[key1] = value1 

example不含key1,它創造了一個新的入口,它的值是字符串value1。如果示例確實包含key1,它會嘗試將字符串value1附加到已存在的任何內容。但是,這沒有意義。您不能使用append追加兩個字符串。

你可能想:

if example.has_key(key1): 
    example[key1].append(value1) 
else: 
    example[key1] = [value1] #the value is a list containing one string 
+0

不錯,但不應該拋出一個AttributeError並保釋出來? – ernie 2012-08-09 18:26:42

+0

是的,這就是我測試代碼時發生的情況。我懷疑OP有一個試圖抓住更高的地方,那就是默默地吃掉錯誤。 – Kevin 2012-08-09 18:30:02

+0

如果它之前有'try:except:',它不會立即退出循環還是繼續循環,而不是凍結? – Josiah 2012-08-10 03:19:08

相關問題