python十六进制数字格式中的数字分组

时间:2019-05-14 14:31:33

标签: python hex python-3.4 number-formatting

说我有很多用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 个答案:

答案 0 :(得分:1)

新的分组选项“ _ ”已introduced in python 3.6

  

'_'选项表示使用下划线表示成千上万   浮点表示形式和整数的分隔符   展示类型“ d”。对于整数表示类型“ b”,“ o”,“ x”,   和“ X”,下划线将每4位插入一次。对于其他   演示文稿类型,则将此选项指定为错误。

     

在3.6版中已更改:添加了'_'选项(另请参见   PEP 515 -- Underscores in Numeric Literals

示例:

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

这当然可以在最新的计算机上使用,但不适用于python 3.4。

答案 1 :(得分:1)

您可以使用itertools recipe中的石斑鱼docs来实现。

>>> 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']

或者对于字符串ooutput:

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

这将在Python 3.4上运行