2015-10-13 8 views
1

У меня есть эта программа python, которая читает файл wordlist и проверяет окончание суффиксов, которые даны в другом файле с использованием метода endswith(). суффиксы, чтобы проверить для сохраняется в списке: suffixList [] Отсчет принимаются с помощью suffixCount []суффиксы count, появляющиеся в файле слова

Ниже приведен мой код:

fd = open(filename, 'r') 
print 'Suffixes: ' 
x = len(suffixList) 
for line in fd: 
    for wordp in range(0,x): 
     if word.endswith(suffixList[wordp]): 
      suffixCount[wordp] = suffixCount[wordp]+1 
for output in range(0,x): 
    print "%-6s %10i"%(prefixList[output], prefixCount[output]) 

fd.close() 

Выход заключается в следующем:

Suffixes: 
able   0 
ible   0 
ation   0 

программа не может достичь этого цикла:

if word.endswith(suffixList[wordp]): 
+0

Что произойдет, если вы уменьшите отступ на 'для вывода в диапазоне (0, x):' блок на четыре пробела? – Kevin

+0

тот же результат –

+1

Вы можете найти словарь - это лучшая структура –

ответ

1

Вам нужно раздеть символ новой строки:

word = ln.rstrip().lower() 

слова приходят из файла так что каждая строка заканчивается символом новой строки. Затем вы пытаетесь использовать endswith, который всегда терпит неудачу, так как ни один из ваших суффиксов не заканчивается символом новой строки.

Я хотел бы также изменить функцию, чтобы вернуть значения, которые вы хотите:

def store_roots(start, end): 
    with open("rootsPrefixesSuffixes.txt") as fs: 
     lst = [line.split()[0] for line in map(str.strip, fs) 
         if '#' not in line and line] 
     return lst, dict.fromkeys(lst[start:end], 0) 

lst, sfx_dict = store_roots(22, 30) # List, SuffixList 

Затем нарежьте с конца и посмотреть, если подстрока в Словаре:

with open('longWordList.txt') as fd: 
    print('Suffixes: ') 
    mx, mn = max(sfx_dict, key=len), min(sfx_dict, key=len) 
    for ln in map(str.rstrip, fd): 
     suf = ln[-mx:] 
     for i in range(mx-1, mn-1, -1): 
      if suf in sfx_dict: 
       sfx_dict[suf] += 1 
      suf = suf[-i:] 
    for k,v in sfx_dict: 
     print("Suffix = {} Count = {}".format(k,v)) 

нарезка конец строка постепенно должна быть быстрее, чем проверка каждой строки, особенно если у вас есть многочисленные суффиксы с одинаковой длиной. В лучшем случае он делает mx - mn итераций, поэтому, если у вас было 20 четырехсимвольных суффиксов, вам нужно будет только один раз проверить dict, только одна подстрока длиной n может быть сопоставлена ​​за раз, поэтому мы бы убили n подстроки длины в одно время с помощью одного срез и поиск.

+0

Спасибо, он работает –

+0

Не беспокойтесь, я бы определенно использовал словарь вместо вашего списка, чтобы хранить подсчеты, использовать суффиксы в качестве ключей и установить значения в 0 initiall затем приращение. –

0

Вы можете использовать счетчик для подсчета вхождений суффикса:

from collections import Counter 

with open("rootsPrefixesSuffixes.txt") as fp: 
    List = [line.strip() for line in fp if line and '#' not in line] 
suffixes = List[22:30] # ? 

with open('longWordList.txt') as fp: 
    c = Counter(s for word in fp for s in suffixes if word.rstrip().lower().endswith(s)) 
print(c) 

Примечание: добавить .split()[0], если есть более одного слова в каждой строке вы хотите игнорировать, в противном случае это лишнее.

Смежные вопросы