Python的str.rstrip()函数是bug还是我自己的愚蠢?
要么这是个错误,要么我快要学到一些关于Python的新知识了。:)
我有一个字典,里面装着一些键值对。每个键都有一个独特的前缀,格式是ias_XX_XX_
。我想从这个字典中获取所有独特的前缀列表。
- 首先,我获取所有以
'_x1'
结尾的键的列表。 - 接下来,我用
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"
一般来说,如果你怀疑某个函数有问题,可以去看看它的文档。