2014-08-30 31 views
0

我想檢查示例測試文件中的每一行是否可以組成一個特定的詞「aardvark」。 例如給定此示例文本:檢查一行中的字母是否可以組成一個詞

No aardv*rks here! 
Only armadillos and anteaters. 
Animals are run down: very awful road kill. 
I prefer a quick guacamole made from avocados. 

應該打印出來:

Aardvark on line 3 
Aardvark on line 4 

由於在3線和4在該行的字母可以使字「土豚」

這是我到目前爲止,我已經從示例文本中的1到行數有多少。我不知道該從哪裏繼續。

lines_counter = 0 
with open ('input.txt') as f: 
    for line in f: 
     if line != '\n': 
      lines_counter += 1 
for c in range(1,lines_counter+1): 
    print(c) 

我也寫了這個,我不認爲這會工作。但我想:(

for c in f: 
    a = c.count('a') 
    r = c.count('r') 
    k = c.count('k') 
    d = c.count('d') 
    v = c.count('v') 
    h = a + r + k + d + v 
+0

這是功課?如果你不得不寫下你要怎麼做的話。其實寫在你的問題,然後把它變成代碼。我會幫你的。 – will 2014-08-30 13:46:37

+0

你能幫我解決這個問題嗎?不,它不是功課,只是我想要做的:) – 2014-08-30 13:48:10

+1

'如果所有(a.count(x)<= line.lower()。count(x) 'a =「aardvark」' – 2014-08-30 14:08:48

回答

1

您可以使用collections.Counter這樣的:

from collections import Counter 

with open ('input.txt') as f: 
    for idx, line in enumerate(f): 
     if line != '\n': 
      counter = Counter(line.lower()) 
      counter.subtract('aardvark') 
      if min(counter.values()) >= 0: 
       print('Aardvark on line %d' % (idx + 1)) 
+0

if min(counter。values())> = 0: – Cld 2014-08-30 14:06:47

+0

@Cld是的,但我正在重寫它,以保持它更簡單;) – 2014-08-30 14:07:25

+0

對不起,但它更復雜... – Cld 2014-08-30 14:13:18

1

讓我們與NumPy做的這一切,我們需要的是一個簡單的轉換功能:

import numpy as np 
def charfreq(s): 
    """Return array with the frequency of each ASCII character from 0 to 127.""" 
    a = np.array(s, 'c').view(np.uint8) 
    return np.bincount(a, minlength=128) 

對於字符串「aardvark」這給了我們:

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 
     0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 

注意位置97處的3,即ord('a')。因此,我們需要三個「一」 S等

現在,只需將您的兩個字符串,我們想找到針和乾草堆中找到它:

needle = charfreq('aardvark') 
haystack = charfreq('Animals are run down: very awful road kill.') 

現在我們有兩個數組,所有剩下的就是比較它們:

np.all(needle <= haystack) 

返回true ...但要注意區分大小寫;如果你想不區分大小寫,你可能希望在使用它們之前小寫字符串。

0

有點晚了,但是:

with open(file_name, 'r') as f: 
    lines = map(set, f.readlines()) 

for i in range(len(lines)): 
    line = lines[i] 
    if set('aardvark').issubset(line): 
     print('Aardvark on line '+str(i+1)) 

這使用套,這是無序列表。

0

這可以更容易,因爲Counter返回0如果你問一個關鍵不在它:

from collections import Counter 
a = Counter("aardvark") 
for pos, string in enumerate(strings): 
    c = Counter(string) 
    if all(c[letter] >= a[letter] for letter in a): 
     print("Aardvark on line", pos+1) 

輸出:

Aardvark on line 3 
Aardvark on line 4 
相關問題