Группировка цифр в шестнадцатеричном формате Python - PullRequest
0 голосов
/ 14 мая 2019

Скажем, у меня есть набор шестнадцатеричных чисел, которые я печатаю на python, например, адреса для целей отладки, и я хочу иметь возможность сравнивать их визуально. Большим подспорьем для этого было бы сгруппировать цифры аналогично тому, как мы используем разделители тысяч для десятичных чисел.

Это также причина, по которой при шестнадцатеричном кодировании цифры группируются по 4, а не в виде длинных строк шестнадцатеричных символов.

Не читается: 47167689711616
Едва читаемый: 2ae61563e000
Наполовину читаемый: 47 167 689 711 616
Наиболее читаемые: 2ae6,1563, e000

Меня не волнует, что такое разделитель, если группировка состоит из 2, 3 или 4 цифр. Тем не менее, опция группировки не работает:

>>> '{:x}'.format(47167689711616)
'2ae61563e000'
>>> '{:,x}'.format(47167689711616)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Cannot specify ',' with 'x'.

Машина, которую я использую (и где я не являюсь администратором), имеет только python 3.4 .

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Вы можете добиться этого, используя группировку рецепт из itertools документы .

>>> import itertools

>>> def grouper(iterable, n, fillvalue=None):
...     args = [iter(iterable)] * n
...     return itertools.zip_longest(*args, fillvalue=fillvalue)
... 
>>>

>>> n = 47167689711616
>>> fs = '{:x}'.format(n) 
>>> fs
'2ae61563e000'
>>> list(''.join(x) for x in grouper(fs, 4, '0'))
['2ae6', '1563', 'e000']

Или для вывода строки:

>>> ' '.join(''.join(x) for x in grouper(fs, 4, '0'))
'2ae6 1563 e000'

Это будет работать на Python 3.4

1 голос
/ 14 мая 2019

Новая опция группировки « _ » была введена в Python 3.6 :

Опция '_' сигнализирует об использовании символа подчеркивания дляразделитель тысяч для типов представления с плавающей запятой и для целочисленного типа представления 'd'.Для целочисленных типов представления «b», «o», «x» и «X» подчеркивания будут вставляться через каждые 4 цифры.Для других типов презентаций указание этого параметра является ошибкой.

Изменено в версии 3.6 : добавлена ​​опция '_' (см. Также PEP 515 - Подчеркивание в числовых литералах ).

Пример:

>>> '{:_x}'.format(47167689711616)
'2ae6_1563_e000'

Конечно, это помогает на современной машине, но не на python 3.4.

...