2011-06-25 44 views
8

要麼這是一個錯誤,要麼我要學習一些關於Python行爲的新東西。 :)Python的str.rstrip()函數中的錯誤,還是我自己的愚蠢?

我有一個字典填充鍵/值對。每個密鑰都有一個唯一的前綴,ias_XX_XX_。我試圖獲得字典中每個唯一前綴的列表。

  1. 首先我得到一個以'_x1'結尾的所有鍵的列表。
  2. 接下來,我使用rstrip('_x1'從它們全部剝離'_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(必須更改打印打印()爲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_2ias_1_3,故障不會發生。這是爲什麼發生?

+0

回想起來,如果'rstrip'的參數是一個集合而不是一個列表,它可能會更加正確,而且更容易混淆。但是稍後會向Python添加集合。 –

+2

您總是可以切掉最後三個字符:'如果key.endswith(「_ x1」)]'',鍵爲uids = [key [: - 3]。請注意'endswith'與您運行的測試不一樣。 – katrielalex

回答

20

的參數rstrip()是一組字符被剝離,而不是一個精確的字符串:

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

一般提示:如果你在某些功能懷疑的錯誤,讀取其documentation

+6

啊哈! RTFM對我來說! :) –

+0

從來沒有意識到這一點!從名稱很容易誤解爲最終刪除'東西'.. – kollery

5

docs,加上強調:

參數chars要被去除的字符串指定的字符集。如果省略或None,則chars參數默認爲刪除空格。 字符參數不是後綴;相反,其值的所有組合都被剝離。

4

.rstrip的參數不是我們想要去除的字符串,而是我們想要去除的字符。檢查的例子:

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

嘗試了這一點,而不是:

unique_ids.append(re.sub('_x1$', '', x1_field) 
+3

謝謝。我最終使用'unique_ids.append(x1_field.rsplit('_ x1',1)[0])'。使用正則表達式解決方案的好處是什麼? –

+0

不是。過早優化可能? :)但我不知道哪一個是最快的。 –

+3

但是我必須承認,我更喜歡你的解決方案......並且基於一些非常快速的測試,它似乎至少是重新測試的兩倍。注意自我:不要依賴正則表達式來處理所有事情。 –

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' 

希望這有助於!