У меня есть задание, которое было поручено мне сделать домашнее задание. В основном проблема заключается в следующем:
Напишите программу, которая может избавиться от названий брендов и заменить их родовыми именами.
В таблице ниже приведены некоторые торговые марки, которые имеют общие названия. Сопоставление также было предоставлено вам в вашей программе в виде словаря BRANDS
.
BRANDS = {
'Velcro': 'hook and loop fastener',
'Kleenex': 'tissues',
'Hoover': 'vacuum',
'Bandaid': 'sticking plaster',
'Thermos': 'vacuum flask',
'Dumpster': 'garbage bin',
'Rollerblade': 'inline skate',
'Asprin': 'acetylsalicylic acid'
}
Это мой код:
sentence = input('Sentence: ')
sentencelist = sentence.split()
for c in sentencelist:
if c in BRANDS:
d = c.replace(c, BRANDS[c])
print(d, end=' ')
else:
print(c, end=' ')
Мои результаты:
Sentence: I bought some Velcro shoes.
I bought some hook and loop fastener shoes.
Sentence: I bought some Velcro shoes.
I bought some hook and loop fastener shoes.
Это выглядит так же, но в моем выводе после 'shoes.'
был дополнительный пробел, когда не должно быть пробела. Так как мне удалить этот пробел?
Я знаю, что вы могли бы сделать rstrip()
или replace()
, и я попробовал это, но это просто перемешало бы все вместе, когда мне просто нужно удалить конечный пробел, а не удалить любой другой пробел. Если пользователь поместил название бренда в середине предложения, а я использовал rstrip()
, это объединит название бренда и остальную часть предложения.
4 ответа
Проблема в том, что print(c, end=' ')
всегда будет печатать пробел после c
. Вот довольно минимальное изменение, чтобы это исправить:
sentence = input('Sentence: ')
sentencelist = sentence.split()
is_first = True
for c in sentencelist:
if not is_first:
print(' ', end='')
is_first = False
if c in BRANDS:
d = c.replace(c, BRANDS[c])
print(d, end='')
else:
print(c, end='')
Как уже отмечали другие, это можно привести в порядок, например, d = c.replace(c, BRANDS[c])
эквивалентно d = BRANDS[c]
, и если вы измените его на c = BRANDS[c]
, то вы можете использовать один {{X3} } вызов и нет else
предложения.
Но вы также должны быть осторожны с вашим подходом, потому что он не даст таких предложений, как «Я купил пылесос». Операция sentence.split()
будет держать "Hoover". как отдельный элемент, и это не пройдёт тест c in BRANDS
из-за дополнительного периода. Вы можете попытаться отделить слова от знаков препинания, но это будет нелегко. Другим решением было бы применить все замены к каждому элементу или, что то же самое, ко всему предложению. В этом случае это должно работать нормально, поскольку вам, возможно, не придется беспокоиться о заменяющих словах, которые могут быть встроены в более длинные слова (например, случайная замена слова «кошка», встроенного в «гусеница»). Так что что-то вроде этого может работать хорошо:
new_sentence = sentence
for brand, generic in BRANDS.items():
new_sentence = new_sentence.replace(brand, generic)
print(new_sentence)
Ключ в том, чтобы использовать метод join
строки, чтобы объединить все для вас. Например, чтобы поместить пробел между кучей строк без пробела после последнего бита, выполните
' '.join(bunch_of_strings)
Строки должны быть в итерируемом, как список, чтобы это работало. Вы могли бы сделать список следующим образом:
edited_list = []
for word in sentence_list:
if word in BRANDS:
edited_list.append(BRANDS[word])
else:
edited_list.append(word)
Гораздо более короткая альтернатива была бы
edited_list = [BRANDS.get(word, word) for word in sentence_list]
В любом случае, вы можете объединить отредактированное предложение, используя метод join
:
print(' '.join(edited_list))
Будучи Python, вы можете делать все как однострочный без использования промежуточного списка:
print(' '.join(BRANDS.get(word, word) for word in sentence_list))
Наконец, вы можете выполнить соединение в print
, используя нотацию с разделителями. Здесь вы должны передать каждый элемент списка в качестве отдельного аргумента и использовать аргумент по умолчанию sep
для вставки пробелов:
print(*edited_list)
Кроме того, d = c.replace(c, BRANDS[c])
является совершенно бессмысленным эквивалентом просто d = BRANDS[c]
. Поскольку строки неизменяемы, каждый раз, когда вы делаете c.replace(c, ...
, вы просто возвращаете замену несколько неразборчивым способом.
Вам не нужно разбивать слово и повторять его.
Попробуйте этот код, он будет работать и больше не будет иметь проблемы с пробелами
sentence = ' '.join(str(BRANDS.get(word, word)) for word in input_words)
Здесь создайте список с именами "input_words" и добавьте номер строки, которую вы хотите обработать
Счастливого обучения!
Ваш end=' '
безусловно добавляет дополнительные пробелы к вашему выводу. Нет единого способа отменить это (отображение символа возврата на задний план работает только для терминалов, поиск работает только для файлов и т. Д.).
Хитрость заключается в том, чтобы избежать печати в первую очередь:
sentence = input('Sentence: ')
sentencelist = sentence.split()
result = []
for c in sentencelist:
# Perform replacement if needed
if c in BRANDS:
c = BRANDS[c] # c.replace(c, BRANDS[c]) is weird way to spell BRANDS[c]
# Append possibly replaced value to list of results
result.append(c)
# Add spaces only in between elements, not at the end, then print all at once
print(' '.join(result))
# Or as a trick to let print add the spaces and convert non-strings to strings:
print(*result)
Похожие вопросы
Новые вопросы
python
Python - это мультипарадигмальный динамически типизированный многоцелевой язык программирования, разработанный для быстрого (для изучения, использования и понимания) и для обеспечения чистого и унифицированного синтаксиса. Обычно используются две похожие, но несовместимые версии Python, Python 2.7 и 3.x. Для специфичных для версии вопросов Python добавьте тег [python-2.7] или [python-3.x]. При использовании варианта или библиотеки Python (например, Jython, PyPy, Pandas, Numpy), пожалуйста, включите их в теги.