检查一行中的字母是否可以构成一个单词

时间:2014-08-30 13:39:43

标签: python python-3.x

我想检查一个示例测试文件中的每一行是否可以组成一个特定的单词' 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行,该行中的字母可以生成单词' aardvark'

这就是我到目前为止,我编号从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

4 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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')。所以我们需要三个“a”等。

现在简单地传递你的两个字符串,我们想找到的针头以及可以找到它的干草堆:

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

现在我们有两个数组,剩下的就是比较它们了:

np.all(needle <= haystack)

返回true ...但要注意区分大小写;如果你想要不区分大小写,你可能想要在使用它们之前小写字符串。

答案 2 :(得分: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))

这使用集合,它们是无序列表。

答案 3 :(得分: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