Python的str.rstrip()函数是bug还是我自己的愚蠢?

9 投票
6 回答
5677 浏览
提问于 2025-04-16 20:17

要么这是个错误,要么我快要学到一些关于Python的新知识了。:)

我有一个字典,里面装着一些键值对。每个键都有一个独特的前缀,格式是ias_XX_XX_。我想从这个字典中获取所有独特的前缀列表。

  1. 首先,我获取所有以'_x1'结尾的键的列表。
  2. 接下来,我用rstrip('_x1')把它们的'_x1'去掉。

这个方法对所有键都有效,除了最后一个ias_1_1_x1。它去掉'_x1'后,不是变成ias_1_1,而是变成了ias_。你可以运行代码看看:

d = {
'ias_16_10_x2':     575, 
'ias_16_10_x1':     0, 
'ias_16_10_y1':     0, 
'ias_16_10_y2':     359,
'ias_16_9_x2':      575, 
'ias_16_9_x1':      0, 
'ias_16_9_y1':      18, 
'ias_16_9_y2':      341, 
'ias_1_1_y1':       0, 
'ias_1_1_y2':       359,  
'ias_1_1_x2':       467, 
'ias_1_1_x1':       108,
}

x1_key_matches = [key for key in d if '_x1' in key]
print x1_key_matches

unique_ids = []
for x1_field in x1_key_matches:
    unique_ids.append(x1_field.rstrip('_x1'))

print unique_ids

实际输出:(Python 2.6、2.7 和 3.2(在3.x中运行时必须把print改成print()))

['ias_16_10_x1', 'ias_16_9_x1', 'ias_1_1_x1']
['ias_16_10', 'ias_16_9', 'ias']   # <<<--- Why isn't this last one ias_1_1???

预期输出:

['ias_16_10_x1', 'ias_16_9_x1', 'ias_1_1_x1']
['ias_16_10', 'ias_16_9', 'ias_1_1']

如果我把键的名字从ias_1_1改成ias_1_2或者ias_1_3,这个问题就不会出现。为什么会这样呢?

6 个回答

4

.rstrip的参数不是我们想要去掉的字符串,而是我们想要去掉的字符。看看下面的例子:

>>> "12345678".rstrip("158")
'1234567'
>>> "12345678".rstrip("asd8qwe")
'1234567'
>>> "12345678".rstrip("78")
'123456'
>>> "1234568788".rstrip("78")
'123456'
5

来自文档,强调部分:

chars参数是一个字符串,用来指定要去掉的字符集合。如果不写这个参数或者写成None,默认就是去掉空白字符。chars参数并不是一个后缀;实际上,它会去掉所有可能组合的这些字符。

20

rstrip()这个函数里的参数是要去掉的一组字符,而不是一个具体的字符串:

>>> "abcbcbaba".rstrip("ab")
"abcbc"

一般来说,如果你怀疑某个函数有问题,可以去看看它的文档

撰写回答