Python的str.rstrip()函数中的错误,还是我自己的愚蠢?

Dav*_*her 8 python string strip

这是一个错误,或者我将要学习一些关于Python行为的新知识.:)

我有一个充满键/值对的字典.每个密钥都有一个唯一的前缀ias_XX_XX_.我正在尝试获取字典中每个唯一前缀的列表.

  1. 首先,我得到一个结束的所有键的列表'_x1'.
  2. 接下来,我'_x1'从他们所有人中剥离使用rstrip('_x1').

这适用于所有这些,除了最后一个,ias_1_1_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
Run Code Online (Sandbox Code Playgroud)

实际输出:(Python 2.6,2.7和3.2(必须更改print to print()以使3.x工作))

['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???
Run Code Online (Sandbox Code Playgroud)

预期产出:

['ias_16_10_x1', 'ias_16_9_x1', 'ias_1_1_x1']
['ias_16_10', 'ias_16_9', 'ias_1_1']
Run Code Online (Sandbox Code Playgroud)

如果我将密钥的名称更改为ias_1_1类似的名称ias_1_2,或者ias_1_3,则不会发生故障.为什么会这样?

Sve*_*ach 20

参数to rstrip()是要剥离的一组字符,而不是精确的字符串:

>>> "abcbcbaba".rstrip("ab")
"abcbc"
Run Code Online (Sandbox Code Playgroud)

一般提示:如果您怀疑某些功能存在错误,请阅读其文档.

  • 啊哈!RTFM对我来说!:) (6认同)

sen*_*rle 5

文档中,重点补充说:

chars参数是一个字符串,指定要删除的字符集.如果省略或None,则chars参数默认为删除空格.chars参数不是后缀 ; 相反,它的所有值组合都被剥离了.