#python #python-3.x #for-loop
#python #python-3.x #for-цикл
Вопрос:
Я только начал изучать программирование на Python в этом семестре, и нам дается несколько упражнений по пересмотру. Однако я застрял на одном из вопросов. В приведенном текстовом файле представлены твиты с выборов в США в 2016 году. Пример, как показано ниже:
I wish they would show out takes of Dick Cheney #GOPdebates
Candidates went after @HillaryClinton 32 times in the #GOPdebate-but remained silent about the issues that affect us.
It seems like Ben Carson REALLY doesn't want to be there. #GOPdebates
RT @ColorOfChange: Or better said: #KKKorGOP #GOPDebate
Вопрос требует, чтобы я написал программу на Python, которая считывает данные из файла tweets.txt . Помните, что каждая строка содержит один твит. Для каждого твита ваша программа должна удалять любое слово длиной менее 8 символов, а также любое слово, содержащее символ хэша (#), at (@) или двоеточие (:). Что у меня есть сейчас:
for line in open("tweets.txt"):
aline=line.strip()
words=aline.split()
length=len(words)
remove=['#','@',':']
for char in words:
if "#" in char:
char=''
if "@" in char:
char=''
if ":" in char:
char=''
это не сработало, и результирующий список по-прежнему содержит @, # или :. Любая помощь приветствуется! Спасибо!
Комментарии:
1. строки неизменяемы, вам нужно создать новую строку, отфильтрованную в соответствии с вашими предпочтениями
2. Список ‘удалить’ не нужен
3. Вам было бы лучше поместить каждую строку в список, а затем использовать цикл for для этого
Ответ №1:
Присвоение char=''
в цикле не изменяет и не удаляет фактический символ (фактически слово) в списке, оно просто присваивает переменной другое значение char
.
Вместо этого вы можете использовать выражение понимания / генератора списка для фильтрации слов, удовлетворяющих условиям.
>>> tweet = "Candidates went after @HillaryClinton 32 times in the #GOPdebate-but remained silent about the issues that affect us."
>>> [w for w in tweet.split() if not any(c in w for c in "#@:") and len(w) >= 8]
['Candidates', 'remained']
При необходимости используйте ' '.join(...)
для объединения оставшихся слов обратно в «предложение», хотя это может не иметь особого смысла.
Ответ №2:
Используйте этот код.
import re
tweet=re.sub(r'#', '',tweet )
tweet=re.sub(r'@', '',tweet )
tweet=re.sub(r':', '',tweet )
Комментарии:
1. Ни одно из них не является регулярным выражением, поэтому вы можете просто использовать
str.replace
. Или используйтеre.sub
withr"[#@:]"
, но это приведет только к удалению этих символов, а не слов, содержащих эти символы.
Ответ №3:
Приведенное ниже действие откроет файл (обычно лучше использовать «с открытым» при работе с файлами), перебирает все строки и удаляет ‘#@:’ с помощью translate . Затем удалите слова, содержащие менее 8 символов, что даст вам вывод «new_line».
with open('tweets.txt') as rf:
for sentence in rf:
line = sentence.strip()
line = line.translate({ord(i): None for i in '#@:'})
line = line.split()
new_line = [ word for word in line if len(word) >= 8 ]
print(new_line)
Это не самый краткий способ, и, безусловно, есть лучшие способы сделать это, но, вероятно, его немного легче читать и понимать, как будто вы только начали учиться, как я.
Комментарии:
1. Спасибо! Нас учили циклам for, поэтому я просто использовал его, но я посмотрю и выучу «with»