Преобразование "0x08h, 0x8ah" в [int,int] в Python
У меня есть строка как x='0x08h, 0x0ah'
в Python, желая преобразовать его в [8,10]
(как неподписанные целые). Я мог бы разбить и проиндексировать это как [int(a[-3:-1],16) for a in x.split(', ')]
но есть ли лучший способ преобразовать его в список целых?
Было бы важно, если бы я y='080a'
?
редактировать (для плюсов:).) Какие (нормальные) шестнадцатеричные нотации на основе строк поддерживают Python, а какие нет?
2 ответа
Вы действительно должны знать, какой шаблон вы пытаетесь проанализировать, прежде чем писать парсер.
Но похоже, что ваш шаблон: необязательно 0x
, затем шестнадцатеричные цифры, затем необязательно h
, По крайней мере, это самая разумная вещь, которую я могу придумать, которая обрабатывает оба '0x08h'
а также '080a'
, Так:
def parse_hex(s):
return int(s.lstrip('0x').rstrip('h'), 16)
Затем:
numbers = [parse_hex(s) for s in x.split(', ')]
Конечно, вам на самом деле не нужно удалять 0x
префикс, потому что Python принимает это как часть шестнадцатеричной строки, так что вы можете написать это как:
def parse_hex(s):
return int(s.rstrip('h'), 16)
Тем не менее, я думаю, что намерение яснее, если вы будете более явными.
Из вашего редактирования:
отредактируйте, какие (нормальные) основанные на строках шестнадцатеричные примечания имеют поддержку Python, а какие нет?
Смотрите документацию для int
:
Литералы Base-2, -8 и -16 могут иметь префикс 0b/0B, 0o/0O или 0x/0X, как и целочисленные литералы в коде.
Вот и все. (Если вы прочитаете остальную часть абзаца, если вы гарантированно 0x/0X
вам не нужно явно использовать base=16. Но это вам здесь не поможет, так что одно предложение - это действительно все, что вам нужно. Документы по числовым типам и числовым литералам подробно описывают, что "как с целочисленными литералами в коде"; единственное, что удивляет, это то, что отрицательные числа не являются литералами, комплексные числа не являются литералами (но это чисто мнимые числа), и могут использоваться не-ASCII-цифры, но документация не объясняет, как.
Вы также можете использовать map
: map(lambda s:int(s.lower().replace('0x','').replace('h',''), 16),x.split(', '))