Python - импортирует более 127 000 слов в список, но функция возвращает только частичные результаты
Эта функция предназначена для сравнения всех 127 000 + слов, импортированных из файла словаря, с введенной пользователем длиной. Затем он должен вернуть количество слов, равное этой длине. Это делает это до некоторой степени.
Если я введу "15", он вернет "0". Если я ввожу "4", он возвращает "3078".
Я уверен, что есть слова длиной 15 символов, но в любом случае он возвращает "0". Я должен также упомянуть, что если я введу что-то больше 15, то результат будет все равно 0, когда есть слова больше 15.
try:
dictionary = open("dictionary.txt")
except:
print("Dictionary not found")
exit()
def reduceDict():
first_list = []
for line in dictionary:
line = line.rstrip()
if len(line) == word_length:
for letter in line:
if len([ln for ln in line if line.count(ln) > 1]) == 0:
if first_list.count(line) < 1:
first_list.append(line)
else:
continue
if showTotal == 'y':
print('|| The possible words remaing are: ||\n ',len(first_list))
2 ответа
Мое чтение:
if len([ln for ln in line if line.count(ln) > 1]) == 0:
в том, что у рассматриваемых слов не может быть повторяющихся букв, которые могли бы объяснить, почему не найдено ни одного слова - как только вы наберете 15, повторяющиеся буквы встречаются довольно часто. Так как это требование не было упомянуто в объяснении, мы можем написать:
def reduceDict(word_length, showTotal):
first_list = []
for line in dictionary:
line = line.rstrip()
if len(line) == word_length:
if line not in first_list:
first_list.append(line)
if showTotal:
print('The number of words of length {} is {}'.format(word_length, len(first_list)))
print(first_list)
try:
dictionary = open("dictionary.txt")
except FileNotFoundError:
exit("Dictionary not found")
reduceDict(15, True)
Который получается около 40 слов из моего Unix words
файл. Если мы хотим вернуть требование уникальности букв:
import re
def reduceDict(word_length, showTotal):
first_list = []
for line in dictionary:
line = line.rstrip()
if len(line) == word_length and not re.search(r"(.).*\1", line):
if line not in first_list:
first_list.append(line)
if showTotal:
print('The number of words of length {} is {}'.format(word_length, len(first_list)))
print(first_list)
Который начинает возвращать 0 результатов около 13 букв, как и следовало ожидать.
В вашем коде вам не нужна эта строка -
for letter in line:
В вашем понимании списка, если вы хотите перебрать все слова в line
использовать этот -
if len([ln for ln in line.split() if line.count(ln) > 1]) == 0:
В вашем коде цикл в списочном понимании зацикливается на каждом символе и проверяет, появляется ли этот символ более одного раза в line
, Таким образом, если ваш файл содержит chemotherapeutic
он не будет добавлен в список first_list
так как есть буквы, которые появляются несколько раз. Таким образом, если ваш файл не содержит слова из более чем 14 букв, в которых все буквы появляются только один раз, ваш код не сможет их найти.