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 букв, в которых все буквы появляются только один раз, ваш код не сможет их найти.

Другие вопросы по тегам