У меня есть задание, которое было поручено мне сделать домашнее задание. В основном проблема заключается в следующем:

Напишите программу, которая может избавиться от названий брендов и заменить их родовыми именами.

В таблице ниже приведены некоторые торговые марки, которые имеют общие названия. Сопоставление также было предоставлено вам в вашей программе в виде словаря 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(), это объединит название бренда и остальную часть предложения.

2
pro_applez 21 Авг 2018 в 08:12

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)
1
Matthias Fripp 21 Авг 2018 в 06:18

Ключ в том, чтобы использовать метод 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, ..., вы просто возвращаете замену несколько неразборчивым способом.

2
Mad Physicist 21 Авг 2018 в 05:43

Вам не нужно разбивать слово и повторять его.

Попробуйте этот код, он будет работать и больше не будет иметь проблемы с пробелами

sentence  = ' '.join(str(BRANDS.get(word, word)) for word in input_words)

Здесь создайте список с именами "input_words" и добавьте номер строки, которую вы хотите обработать

Счастливого обучения!

0
Jitesh Vacheta 21 Авг 2018 в 05:40

Ваш 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)
1
ShadowRanger 21 Авг 2018 в 05:30
51941949