2013-04-09 4 views
0

Мне нужно создать список слов из текстового файла. Список будет использоваться в коде палача и необходимо исключить следующие из списка:Список слов из текстового файла

  1. дублирующихся слов
  2. слова, содержащие менее 5 букв
  3. слова, которые содержат «хх» в качестве подстроки
  4. слова, содержащие буквы верхнего регистра
  5. список

этого слова, то должно выводиться в файл, так что на отдельной строке каждое слово. Программа также должна выводить количество слов в конечном списке.

Это то, что у меня есть, но оно работает неправильно.

def MakeWordList(): 
    infile=open(('possible.rtf'),'r') 
    whole = infile.readlines() 
    infile.close() 

    L=[] 
    for line in whole: 
     word= line.split(' ') 
     if word not in L: 
      L.append(word) 
      if len(word) in range(5,100): 
       L.append(word) 
       if not word.endswith('xx'): 
        L.append(word) 
        if word == word.lower(): 
         L.append(word) 
    print L 

MakeWordList() 
+0

Как это работает неправильно? Что вы ожидаете, и что на самом деле происходит? –

+0

Это не забирает слова, которые составляют менее 5 букв, и удерживает слова заглавными буквами. – user2259766

ответ

1

Вы Добавляя слово много раз с этим кодом,
Вы arn't фактически отфильтровывая слова вообще, просто добавляя их различное количество приуроченная в зависимости от того, сколько if «s они проходят ,

вы должны объединить все if «S:

if word not in L and len(word) >= 5 and not 'xx' in word and word.islower(): 
    L.append(word) 

Или, если вы хотите его более удобным для чтения вы можете разделить их:

if word not in L and len(word) >= 5: 
     if not 'xx' in word and word.islower(): 
      L.append(word) 

Но не добавлять после каждого из них.

+1

Вместо 'word.endswith ('xx')' он должен быть '' xx 'в слове'. – twasbrillig

+0

@twasbrillig, тогда '' abxxcd "' также будет соответствовать. Это не то, что он хочет. – Serdalis

+0

Позвольте мне уточнить. Вместо 'not word.endswith ('xx')' оно должно быть 'not 'xx' в слове'. В противном случае '' abxxcd "' также будет соответствовать, что не то, что он хочет. – twasbrillig

0

Подумайте об этом: в ваших вложенных операторах-операторах ЛЮБОЕ слово, которое еще не в списке, проведет его на первой строке. Тогда, если это 5 или более символов, он снова добавит (держу пари) и снова и т. Д. Вам нужно переосмыслить свою логику в операторах if.

0

Улучшен код:

def MakeWordList(): 
    with open('possible.rtf','r') as f: 
     data = f.read() 
    return set([word for word in data if len(word) >= 5 and word.islower() and not 'xx' in word]) 

set(_iterable_) возвращает объект набора типа, который не имеет дубликатов (все set элементы должны быть уникальными). [word for word...] - это список, который представляет собой более короткий способ создания простых списков. Вы можете перебирать каждое слово в «данных» (это предполагает, что каждое слово находится на отдельной строке). if len(word) >= 5 and word.islower() and not 'xx' in word выполняет заключительные три требования (должно быть более 5 букв, иметь только строчные буквы и не может содержать «xx»).

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