Либо это ошибка, либо я собираюсь узнать что-то новое о том, как ведет себя Python. :)Ошибка в функции str.rstrip() 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 (необходимо изменить шрифт для печати() для 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
, сбой не возникает. Почему это происходит?
В ретроспективе это могло быть более правильным и менее запутанным, если аргумент 'rstrip' был набором вместо списка. Но наборы позже были добавлены в Python. –
Вы всегда можете просто срезать последние три символа: 'uids = [key [: - 3] для ключа в d, если key.endswith (" _ x1 ")]'. Обратите внимание, что 'endswith' не совпадает с тестом, который вы выполнили. – katrielalex