2014-08-30 42 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 
相关问题