说我有很多用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 。
答案 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上运行