2012-08-07 69 views
-1

我正在處理一個腳本,腳本應該讀取一個文本文件並測試以查看指定的字母(a,a,r,d,v,a,r,k)是否在每行上。我有一個問題,因爲我想檢查3個不同的a而不是一個。我的代碼如下:測試所有字母?

#Variables 
advk = ['a','a','r','d','v','a','r','k'] 
textfile = [] 
number = 0 
life = 0 

for line in open('input.txt', 'rU'): 
    textfile.append(line.rstrip().lower()) 


while life == 0: 
    if all(word in textfile[number] for word in advk): 
     printed = number + 1 
     print ("Aardvark on line " + str(printed)) 
     number+=1 
     if number == len(textfile): 
      life+=1 

    else: 
     number+=1 
+0

因此,當在行上找到'advk'中的一個字母時,您希望該字母被「消耗」並且不計入其餘的搜索? – Marius 2012-08-07 06:56:27

+0

對於語法分析,您正在尋找一個文件中的「行」包含字母'['a','a','r','d','v','a','r', 'k']'的順序?或者它們完全包含在行中?在這種情況下,您可以檢查唯一值,'['a','r','d','v','k']'。或者你只是想知道單詞「aardvark」是否存在於一行文件中? – 2012-08-07 07:09:38

+0

@InbarRose我想看看我能否在該行的角色上製造盜賊。 – 2012-08-07 07:25:59

回答

8

每次你要計算在Python的東西,保持Counter類的初衷。


from collections import Counter 

advk = Counter(['a','a','r','d','v','a','r','k']) 

with open('input.txt', 'rU') as file: 
    for i, line in enumerate(file.readlines()): 
     if not advk - Counter(line.lower()): 
      print ("Aardvark on line " + str(i+1)) 

鑑於輸入線

dffdaardvarksdsda

計數器看起來像這些

Counter({'d': 5, 'a': 4, 'f': 2, 's': 2, 'r': 2, 'k': 1, 'v': 1}) 

Counter({'a': 3, 'r': 2, 'd': 1, 'k': 1, 'v': 1}) 

您的信件,搜索列表。

我們通過簡單地減去兩個計數器advl - Counter(line.lower())來檢查結果計數器是否沒有元素。


其他注意事項:

可以使用with聲明,以確保你的文件被關閉。
您可以使用enumerate來代替計算行號。

+0

感謝人真的幫助了這個大約4個小時哈哈哈。 – 2012-08-07 07:41:30

+1

+1將我的注意力集中到了我從未注意過的標準庫類,但經常有用。謝謝。 – Oddthinking 2012-08-07 07:48:49

-3

如果advk列表是可變的,內容是從其他地方,那麼讀取保持在列表中的獨特元素,你可以將其轉換爲設置和檢查。

advk = ['a','a','r','d','v','a','r','k'] 
advk = list(set(advk)) 

這使得advk成爲一個獨特的列表,並避免檢查多個「a」。

+0

兩件事情:爲什麼要將它轉換回列表?集合是可迭代的,並且集合中的點快速檢查成員資格(當您轉換回列表時,您將失去基於快速哈希的成員資格測試)。而且,Dragan似乎希望整個詞「土豚」能夠在線上被炒作。這種方法會讓「ardvrk」通過。 – 2012-08-07 07:05:05

+0

在風格上,由於字符串是可迭代的,所以你可以直接說'advk = set(「aardvark」)'。 – 2012-08-07 07:07:30

-3
# If the line "ardvrk" should match, this is a solution: 
chars=set('aardvark') 
for nr, line in enumerate(open('input.txt', 'rU')): 
    if not chars-set(line): # is subset? 
     print 'match', nr, line, 
+0

加1,不知道他是否想檢查大寫匹配或不。 – 2012-08-07 07:24:49

+0

你的假設是錯誤的,ardvrk應該*不匹配,所以這不是解決OP的問題。 – 2012-08-07 07:28:26

+0

我會用chars.issubset() – 2012-08-07 07:29:40