Ошибка в функции Python str.rstrip (), или моя собственная глупость? - PullRequest
8 голосов
/ 25 июня 2011

Либо это ошибка, либо я собираюсь узнать что-то новое о том, как ведет себя 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

Фактический вывод : (Python 2.6, 2.7 и 3.2 (необходимо изменить print на 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,сбоя не происходит.Почему это происходит?

Ответы [ 6 ]

20 голосов
/ 25 июня 2011

Параметр rstrip() - это набор символов для удаления, а не точная строка:

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

Общая подсказка: если вы подозреваете ошибку в какой-либо функции, прочитайте ее документацию .

5 голосов
/ 25 июня 2011

Из документов , добавлен акцент:

Аргумент chars - это строка, определяющая набор символов, которые необходимо удалить. Если значение опущено или отсутствует, аргумент chars по умолчанию удаляет пробелы. Аргумент chars не является суффиксом ; скорее все комбинации его значений обрезаны.

4 голосов
/ 25 июня 2011

.rstrip параметр не строка, которую мы хотим удалить, это символы, которые мы хотим удалить.Проверьте эти примеры:

>>> "12345678".rstrip("158")
'1234567'
>>> "12345678".rstrip("asd8qwe")
'1234567'
>>> "12345678".rstrip("78")
'123456'
>>> "1234568788".rstrip("78")
'123456'
3 голосов
/ 25 июня 2011

.rstrip() удаляет все комбинации совпадающих символов, не фактическую строку, которую вы предоставляете. Смотри http://docs.python.org/library/stdtypes.html.

2 голосов
/ 25 июня 2011

Попробуйте вместо этого:

unique_ids.append(re.sub('_x1$', '', x1_field)
0 голосов
/ 21 мая 2017

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'

Надеюсь, это поможет!

...