这是一个错误,或者我即将学习有关Python行为方式的新内容。 :)
我有一个充满键/值对的字典。每个密钥都有一个唯一的前缀 ias_XX_XX_
。我正在尝试获取字典中每个唯一前缀的列表。
'_x1'
结尾的所有密钥的列表。'_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
实际输出 :( 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???
预期输出:
['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
,则不会出现故障。为什么会这样?
答案 0 :(得分:20)
rstrip()
的参数是要剥离的一组字符,而不是精确的字符串:
>>> "abcbcbaba".rstrip("ab")
"abcbc"
一般提示:如果您怀疑某些功能存在错误,请阅读documentation。
答案 1 :(得分:5)
从docs开始强调:
chars参数是一个字符串,指定要删除的字符集。如果省略或None,则chars参数默认为删除空格。 chars参数不是后缀;相反,它的所有值组合都被剥离了。
答案 2 :(得分:4)
.rstrip的参数不是我们要删除的字符串,而是我们要删除的字符。检查一下示例:
>>> "12345678".rstrip("158")
'1234567'
>>> "12345678".rstrip("asd8qwe")
'1234567'
>>> "12345678".rstrip("78")
'123456'
>>> "1234568788".rstrip("78")
'123456'
答案 3 :(得分:3)
.rstrip()
删除匹配字符的所有组合,不您提供的实际字符串。请参阅http://docs.python.org/library/stdtypes.html。
答案 4 :(得分:2)
试试这个:
unique_ids.append(re.sub('_x1$', '', x1_field)
答案 5 :(得分:0)
rstrip 会返回删除了尾随字符的字符串副本。
例如:
>>> ' spacious '.rstrip()
' spacious'
>>> "AABAA".rstrip("A")
'AAB'
>>> "ABBA".rstrip("AB") # both AB and BA are stripped
''
>>> "ABCABBA".rstrip("AB")
'ABC'
########
>>> ' spacious '.rstrip()
' spacious'
>>> 'mississippi'.rstrip('ipz')
'mississ'
如果您要处理文件名,请格外小心,
>>> "cosmac.csv".replace(".csv")
'cosma'
>>> "cosmac.csv".replace(".csv", "")
'cosmac'
希望这有帮助!