2013-11-21 54 views
-2

我試圖從文件中讀取字符串中的常見元素。這是我寫的:找到字符串中的常見元素python

file = open ("words.txt", 'r') 

while 1: 
    line = file.readlines() 
    if len(line) == 0: 
     break 
    print line 
file.close 


def com_Letters(*strings): 
    return set.intersection(*map(set,strings)) 

,結果證明:['out\n', 'dog\n', 'pingo\n', 'coconut']

我把com_Letters(line),但結果是空的。

+1

嘿,'words.txt'裏有什麼?還有,你期望輸出什麼? – msturdy

+0

這個循環應該做什麼? ['readlines()'](http://docs.python.org/2.7/library/stdtypes.html#file.readlines)保證讀取直到EOF。你是否試圖防範不可能的事情,還是有其他原因呢? – abarnert

+0

當我運行這個時,無論文件中有什麼,我實際上'set'對象的'TypeError:描述符'交集'需要一個參數',而不是空的結果。 – abarnert

回答

0

我建議修改的功能如下:

def com_Letters(strings): 
    return set.intersection(*map(set,strings)) 

我認爲該功能處理所述參數字符串作爲字符串(在這種情況下,一個單獨的列表傳遞只有一個參數)的列表的列表,並且因此找不到交點。

1

有兩個問題,但都不是com_Letters

首先,這段代碼保證line將永遠是一個空列表:

while 1: 
    line = file.readlines() 
    if len(line) == 0: 
     break 
    print line 

通過循環的第一次,你叫readlines(),這將

Read until EOF using readline() and return a list containing the lines thus read.

如果該文件是空的,這是一個空的列表,所以你會打破。

否則,您將打印出列表,然後返回循環。在這一點上,readlines()將沒有剩下可讀的內容,因爲你已經閱讀到EOF,所以它肯定是一個空列表。這意味着你會打破。

無論哪種方式,list結束爲空。

目前還不清楚你想要用這個循環做什麼。從來沒有任何理由在同一個文件上反覆調用readlines()。但是,即使存在,您可能也想積累所有結果,而不是隻保留最後一個(保證爲空)的結果。事情是這樣的:

while 1: 
    new_line = file.readlines() 
    if len(new_line) == 0: 
     break 
    print new_line 
    line += new_line 

無論如何,如果你解決這個問題(例如,由報廢的整個循環,只是使用line = file.readlines()),你打電話com_Letters與字符串的一個列表。這不是特別有用;這只是調用set的一種非常複雜的方式。如果還不清楚爲什麼:

  • 由於只有一個參數(字符串列表),所以*strings最終成爲該參數的一個元素元組。
  • map(set, strings)對單元素元組只調用set該元素並返回一個單元素列表。
  • *map(set, strings)將其分解爲一個參數集。
  • set.intersection(s)s.intersection()是一樣的,它自己只返回s

所有這一切會更容易看到,如果你分手了其中的一些複雜的表達式和print編的中間值。然後你就會確切知道它首先出錯的地方,而不是僅僅知道它在某個長鏈事件中的某個地方。


一些旁註:

您在file.close忘了(),這意味着你沒有真正關閉文件。 with更好的原因之一是它意味着你不能犯這個錯誤。

對集合使用複數名稱。 line聽起來像一個變量,它應該有一個單一的行,而不是一個變量,應該有你所有的行。

readlines沒有sizehint參數的函數基本沒用。如果你只是要遍歷行,你可以做到這一點的文件本身。如果你真的需要列表中的行,而不是懶洋洋地閱讀,list(file)會讓你的意圖更清晰 - 並且不會誤導你認爲重複執行可能有用。

檢查空集合的Pythonic方法只是if not line:,而不是if len(line) == 0:

while Truewhile 1更清楚。