Фильтровать список по длине слова - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь отфильтровать список, где есть слова, строка за строкой, по длине слова (от 4 до 8 символов).Так что если входной файл имеет:

  • привет
  • связь
  • be
  • собака
  • проверка

Выходной файл:

  • привет
  • тест

Итак, у меня есть этот код:

dir = "lower.lst"
dict = open(dir, 'r').readlines()
f=open('dictionary','w')
for word in dict:
  if len(word)>=4 & len(word)<=8:
    f.write(word)
f.close()
print(len(dict))

print(f)

Но выходной файл содержит все слова.Кстати, есть ли более эффективный способ сделать это?

Ответы [ 5 ]

0 голосов
/ 23 ноября 2018
  • Используйте оператор with для автоматического закрытия файлов (даже если встречаются исключения).
  • & в Python действительно только для битовых твидлингов, используйте and.
  • На самом деле вам не нужно and, потому что сравнения могут быть связаны.(len(word)>=4 and len(word)<=8 эквивалентно 4 <= len(word) <= 8).
  • В вашем вопросе вы используете .readlines(), а здесь я использую for line in fin:.В любом случае результирующие строки будут заканчиваться символами новой строки, поэтому ваши измерения длины будут отключены на один.Я исправляю это, обрезая линию, прежде чем брать длину (len(line.strip())).(Ваш код, как написано, должен был опустить 'be', но сохранить 'dog', потому что это действительно 'dog\n', который имеет длину 4).
  • Вы сказали, что ваш код сохранил все слова.На мой взгляд, ваш код должен был пропустить 'communication\n' и 'be\n'.Я мог бы предположить, что 'be\n' может быть сохранено, если после него в файле будут дополнительные пробелы ('be \n 'имеет длину 5 из-за двух пробелов).Но, похоже, нет логического способа, которым 'communication\n' будет храниться в вашем выходном файле.Вы можете перепроверить, что это действительно было там.

with open('lower.lst', 'r') as fin, open('dictionary', 'w') as fout:
    for line in fin:
        if 4 <= len(line.strip()) <= 8:
            fout.write(line)
0 голосов
/ 23 ноября 2018

Ваш код должен работать, если вы замените & на and, то есть:


dict = open("lower.lst", 'r').readlines()
with open('dictionary','w') as f:
    for word in dict:
        if len(word)>=4 and len(word)<=8:
            f.write(word)
0 голосов
/ 23 ноября 2018

Понимание списка позволяет вам выбирать, из каких элементов вы хотите построить свой список.Вот пример реализации:

s = """
hello
communication
be
dog
test
"""

lst = [elm for elm in s.split() if (len(elm) >= 4 and len(elm) <= 8)]

print(lst)

Вывод:

['hello', 'test']
0 голосов
/ 23 ноября 2018

Это то, что вы ищете?Здесь я использую файловые менеджеры контекста с зарезервированным словом with и использую and вместо &, как отмечено в комментариях.

with open("lower.lst", "r") as f:
   o = [word for word in f if (len(word) >= 4 and len(word) <= 8)]

with open("outfile.lst", "w") as f:
   f.write(o)

Сложно понять, отформатируется ли этоименно к вашим намерениям в outfile.

0 голосов
/ 23 ноября 2018

Для этого существует несколько вариантов.

  1. С filter () встроенная функция

Проверка документов здесь .

Предположим, у вас есть список строк с именем data, тогда:

data = ['hello', 'communication', 'be', 'dog', 'test']
filtered_list = filter(lambda x: len(x) > 4 and len(x) < 8, data)
print(filtered_list)

Вернет:

Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
>   
['hello']

Вы можете изменитьлямбда-функция для фильтрации различных условий.Фильтр «поймает» каждый элемент, который возвращает True.

С списком-понятием

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

filtered_list = [x for x in data if len(x) > 4 and len(x) < 8]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...