仅从输出中删除尾随空格

Remove only trailing whitespace from output

我有一项布置给我的家庭作业。基本上问题是:

编写一个程序,可以去除品牌名称并用通用名称替换它们。

下面的 table 显示了一些具有通用名称的品牌名称。该映射也已在您的程序中作为 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(),它会将品牌名称和句子的其余部分连接在一起。

您的 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)

关键是使用字符串的 join 方法为您连接所有内容。例如,要在一堆字符串之间放置 space 而不是在最后一位之后放置 space,请执行

' '.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 参数插入 spaces:

print(*edited_list)

顺便说一句,d = c.replace(c, BRANDS[c]) 完全等同于 d = BRANDS[c]。由于字符串是不可变的,任何时候你这样做 c.replace(c, ...,你只是以一种有点难以辨认的方式返回替换。

您不必拆分单词并遍历它。

试试这个代码,它会起作用,不会再出现白色问题 space

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

在这里,列出名称"input_words"并添加您要处理的行数

学习愉快!

问题是 print(c, end=' ') 总是会在 c 之后打印一个 space。这是一个非常小的更改来解决这个问题:

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],则可以使用单个 print 调用且没有 else 子句。

但是你也必须小心你的方法,因为对于像 "I bought a Hoover." 这样的句子它会失败 sentence.split() 操作将保持 "Hoover." 作为一个单独的项目,这将由于额外时间未通过 c in BRANDS 测试。您可以尝试将单词与标点分开,但这并不容易。另一种解决方案是将所有替换应用于每个元素,或者等效地应用于整个句子。这在这种情况下应该可以正常工作,因为您可能不必担心可能嵌入较长单词的替换单词(例如,不小心替换了 'caterpillar' 中嵌入的 'cat')。所以这样的事情可能行得通:

new_sentence = sentence
for brand, generic in BRANDS.items():
    new_sentence = new_sentence.replace(brand, generic)
print(new_sentence)