我有一项任务分配给我做家庭作业。基本上问题是:
编写一个可以去除品牌名称的程序,然后将其替换为通用名称。
下表显示了一些具有通用名称的品牌名称。映射也已在您的程序中作为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()
,它将把品牌名称和句子的其余部分结合在一起。
答案 0 :(得分:2)
关键是使用字符串的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))
最后,您可以使用splat表示法在print
本身中进行联接。在这里,您将传入列表中的每个元素作为单独的参数,并使用默认的sep
参数插入空格:
print(*edited_list)
顺便说一句,d = c.replace(c, BRANDS[c])
完全等同于d = BRANDS[c]
。由于字符串是不可变的,因此每次执行c.replace(c, ...
时,您只是以某种难以理解的方式返回替换项。
答案 1 :(得分:1)
您的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)
答案 2 :(得分:1)
问题在于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]
,则可以使用单个{ {1}}调用,没有print
子句。
但是您还必须谨慎对待您的方法,因为它对于诸如“我买了胡佛”之类的句子会失败。 else
操作将保留“胡佛”。作为单个项目,由于额外的期限而将无法通过sentence.split()
测试。您可以尝试将单词与标点符号分开,但这并不容易。另一个解决方案是将所有替换项应用于每个元素,或等效地应用于整个句子。在这种情况下,这种方法应该可以正常工作,因为您可能不必担心可能会嵌入较长字词的替换字词(例如,意外替换了嵌入在“ caterpillar”中的“ cat”字词)。所以像这样的东西可能行得通:
c in BRANDS
答案 3 :(得分:0)
您不必拆分单词并遍历单词。
尝试此代码将起作用,并且不再会出现空格问题
sentence = ' '.join(str(BRANDS.get(word, word)) for word in input_words)
在此,创建一个名为“ input_words”的列表,并添加您要处理的行数
学习愉快!