f 字符串可以在输出时自动填充到[下一个]偶数位数吗?

问题描述 投票:0回答:4

基于这个答案(除其他外),似乎 f 字符串是转换为十六进制表示的首选方法之一。

虽然可以指定一个明确的目标长度,最多用前导零填充,给定输出具有偶数位数的目标,并且输入具有任意位数,我可以想象:

  • 预处理以确定输入的位数,将特定于输入的值馈入 fstring,或者
  • 后期处理a-la
    out = "0"+f"{val:x}" if len(f"{val:x}") % 2 else f"{val:02x}"
    (甚至使用
    .zfill()

后者似乎可能比前者更有效 - 有没有内置的方法可以使用 fstrings 来做到这一点,或者更好的替代方案?

输入+预期输出示例:

[0x]1 -> [0x]01
[0x]22 -> [0x]22
[0x]333 -> [0x]0333
[0x]4444 -> [0x]4444

等等。

python hex f-string
4个回答
1
投票

这是使用赋值表达式的后处理替代方案(Python 3.8+):

print((len(hx:=f"{val:x}") % 2) * '0' + hx)

如果您仍然想要一个没有赋值表达式的单行代码,则必须对 f 字符串求值两次:

print((len(f"{val:x}") % 2) * '0' + f"{val:x}")

作为两线

hx = f"{val:x}"
print((len(hx) % 2) * '0' + hx)

还有一个版本:

print(f"{'0'[:len(hex(val))%2]}{val:x}")

0
投票

我认为 f 字符串格式中没有任何内置功能可以做到这一点。您可能必须弄清楚“自然”宽度是多少,然后将其四舍五入到下一个偶数。

类似这样的:

def hf(n):
    width = len(hex(n)) - 2 # account for leading 0x
    width += width % 2 # round up
    return f'{n:0{width}x}'

print(hf(1))
print(hf(15))
print(hf(16))
print(hf(255))
print(hf(256))

输出:

01
0f
10
ff
0100

0
投票

您可以在 f 字符串的 pad-length 部分使用变量。例如:

n = 4
val = 257
print(f"{val:0{n}x}") # 0101

现在,要计算出整数中有多少个十六进制字符,您只需找到整数中有多少位即可:

hex_count, rem = divmod(max(1, val.bit_length()), 4)
hex_count += (rem > 0)

max(1, val.bit_length())
处理
val == 0
的情况,其位长度为0)

所以让我们得到

hex_count
之后的下一个偶数:

pad_length = hex_count + (hex_count % 2)
print(f"{val:0{pad_length}x}") # 0101

我不确定这是否比简单地将其转换为十六进制字符串然后计算出需要多少填充更好,但我想不出一种可读的方法来在 f 字符串中完成这一切。一种“不可读”的方法是将以上所有内容合并到一行中,但在我看来,可读的代码比不可读的单行代码更好。我认为没有办法指定您想要的简单 f 字符串。 请注意,负数被格式化为偶数位数,加上

-

符号。

    


0
投票

"".join(map("{0:02x}".format, [0, 1, 2, 3]))

© www.soinside.com 2019 - 2024. All rights reserved.