【问题标题】:Digit grouping in python hexadecimal number formattingpython十六进制数字格式中的数字分组
【发布时间】:2019-05-14 14:31:33
【问题描述】:

假设我有一堆十六进制数字,我在 python 中打印,例如,用于调试目的的地址,我希望能够直观地比较它们。一个很大的帮助是对数字进行分组,类似于我们使用千位分隔符来表示十进制数。

这也是为什么当你 hexdump 某些数字按 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

【问题讨论】:

    标签: python hex python-3.4 number-formatting


    【解决方案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 没有帮助。

    【讨论】:

    • 请注意,宽度规范也计算分隔符,所以f'{123456:09_x}' 会给你0001_e240
    【解决方案2】:

    您可以使用 itertools docs 中的 grouper recipe 来实现此目的。

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

    【讨论】:

    • 这很有效。您使用zip_longest 而不是zip 来预测位数不是n 的倍数的情况(然后fillvalue 应该是例如''。但是这会留下任何非n 的倍数组在最右边而不是左边。你可以通过反转序列两次来解决这个问题(虽然它不是很优雅?):lambda num: ''.join(reversed('_'.join(''.join(x) for x in itertools.zip_longest(*([iter(reversed('{:x}'.format(num)))] * 4), fillvalue = ''))))
    • @Cimbali,是的,'0' 是一个糟糕的填充值选择 - 我也许应该选择一些明显非数字的东西来使填充更明显,然后 OP 可以决定如何处理它们,如果他们的流不是组值的精确倍数。
    猜你喜欢
    • 2010-12-09
    • 2015-01-13
    • 1970-01-01
    • 2021-11-20
    • 2022-01-09
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多