从输出中仅删除尾随空格

时间:2018-08-21 05:12:55

标签: python replace removing-whitespace

我有一项任务分配给我做家庭作业。基本上问题是:

编写一个可以去除品牌名称的程序,然后将其替换为通用名称。

下表显示了一些具有通用名称的品牌名称。映射也已在您的程序中作为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 个答案:

答案 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”的列表,并添加您要处理的行数

学习愉快!