2010-05-24 55 views
0

我有這段代碼 代碼的最後一位從d = {} 即時通訊嘗試打印與其行號位於文本中的單詞,但它不是唯一的印刷單詞任何人都知道爲什麼? ?? 需要幫助儘快爲什麼這個字典行數不起作用?

import sys 
import string 

text = [] 
infile = open(sys.argv[1], 'r').read() 
for punct in string.punctuation: 
    infile = infile.replace(punct, "") 
    text = infile.split("\n") 

dict = open(sys.argv[2], 'r').read() 
dictset = [] 
dictset = dict.split() 

words = [] 
words = list(set(text) - set(dictset)) 
words = [text.lower() for text in words] 
words.sort() 

d = {} 
counter = 0 
for lines in text: 
    counter += 1 
if word not in d: 
    d[words] = [counter] 
else: 
    d[words.append[counter] 
print(word, d) 

這段代碼輸出:

helo 
goin 
ist 

我希望它輸出:

helo #tab# 3 4 
goin #tab# 1 2 
+1

你的代碼甚至在語法上都不是有效的......如果你需要幫助,你將不得不解決。更何況,如何解釋它應該如何工作?示例輸出,你得到了什麼,它應該給予什麼? – 2010-05-24 04:10:35

+0

什麼意思由sytacillay有效如何修復它即時新? 並確定如何添加輸出和它應該做什麼 – jad 2010-05-24 04:15:23

+1

此代碼不運行或工作原因如下:括號不平衡,不正確的縮進,變量'word'從未設置等。請張貼您的實際代碼。此外,僅供參考,您可以使用'collections.defaultdict(list)'而不是普通字典來簡化您的代碼,以便您不必測試'如果d中的單詞':您可以只說'd [單詞] .append(計數器)'。 – 2010-05-24 04:15:45

回答

2

text列表,它列表LINES。當你這樣做:

text = infile.split() 

你是不可逆的,永遠丟掉一個詞,它是在該行之間的所有連接所以當你以後寫

for lines in text: 

這是一個謊言:text的物品有,不是行。如果他們沒有,那麼這個其他早期線路:

words = list(set(text) - set(dictset)) 

將打破完全 - 這取決於text的項目是的話,不是行。

而且,順便說一句,當你這樣做:

words = [text.lower() for text in words] 

text現在留給綁定到最後一個項目中words - 你摧毀任何其他值先前所擁有。

建議一:停止重複使用標識符以實現許多不同的,不兼容的目的。對自己做出承諾,即任何標識符都不會被綁定到任何一個程序中的兩個不同的事物上。這至少可以減少你經理堆在這麼幾行上的絕對混亂的難以置信的數量。

+0

或者更糟糕的是,'dict' ... – Ken 2010-05-24 04:23:34

+0

所以我刪除 text = infile.split()??????????????/ – jad 2010-05-24 04:26:21

+1

@jad,你再次從頭開始重寫,永遠的誓言,**永遠**重複使用一個標識符爲不同的事情。你不能避免讓'text'成爲一個單詞列表,因爲正如我指出的那樣,當你從中設置一個'set'時,你必須這樣做 - 但是你需要一個行列表來代替(拆分,而不是拆分),當你需要行號。很明顯,你不能爲了兩個目的而使用單個標識符「文本」(並且除此之外,例如,列表理解中的控制變量)。使用不同的,更清晰,明確的標識符,並從頭開始重新考慮你的作業。 – 2010-05-24 04:30:07