将真假数组转换为十六进制值 Python

5 投票
6 回答
3634 浏览
提问于 2025-04-18 23:27

我有一个包含真和假的答案的列表,像这样:

[True, True, True, False, False, True, False, False]
[True, True, False, False, True, False, False, True]
[True, False, False, True, False, False, True, True]
[False, False, True, False, False, True, True, True]
[False, True, False, False, True, True, True, False]
[True, False, False, True, True, True, False, False]
[False, False, True, True, True, False, False, True]
[False, True, True, True, False, False, True, False]

我想把真(True)赋值为1,把假(False)赋值为0,然后把这个总值转换成十六进制。 我该怎么做呢?我可以逐个查看列表中的每个值,如果它是'真'就把它改成1,如果是'假'就改成0,还是说有更简单的方法可以直接把整个列表转换成十六进制呢?

编辑:这是完整的代码在Pastebin上: http://pastebin.com/1839NKCx

谢谢

6 个回答

0

一句话总结:

>>> lists = [
[True, True, True, False, False, True, False, False],
[True, True, False, False, True, False, False, True],
[True, False, False, True, False, False, True, True],
[False, False, True, False, False, True, True, True],
[False, True, False, False, True, True, True, False],
[True, False, False, True, True, True, False, False],
[False, False, True, True, True, False, False, True],
[False, True, True, True, False, False, True, False]]
>>> ''.join(hex(int(''.join('1' if boolValue else '0' for boolValue in byteOfBools),2))[2:] for byteOfBools in lists)
'e4c993274e9c3972'

内连接会生成一个由八个零和一组成的字符串。

int(foo,2) 这个操作会把这个字符串当作二进制数转换成数字。

hex 会把这个数字转换成十六进制格式。

[2:] 这个操作会去掉标准十六进制格式前面的 '0x'。

外连接会对所有子列表进行类似的操作,然后把结果合并在一起。

0

这样做就可以了:

def bool_list_to_hex(list):
  n = 0
  for bool in list:
    n *= 2
    n += int(bool)
  return hex(n)
1

如果你使用了reduce,就不需要分两步来处理了(假设最高有效位通常在左边):

b = [True, True, True, False, False, True, False, False]
val = reduce(lambda byte, bit: byte*2 + bit, b, 0)

print val
print hex(val)

显示结果:

228
0xe4
1

如果你想把一系列的布尔值(也就是真或假的值)合并成一个值(像一个位字段),你可以这样做:

x = [True, False, True, False, True, False ]
v = sum(a<<i for i,a in enumerate(x))
print hex(v)
8
lists = [
    [True, True, True, False, False, True, False, False],
    [True, True, False, False, True, False, False, True],
    [True, False, False, True, False, False, True, True],
    [False, False, True, False, False, True, True, True],
    [False, True, False, False, True, True, True, False],
    [True, False, False, True, True, True, False, False],
    [False, False, True, True, True, False, False, True],
    [False, True, True, True, False, False, True, False],
]

for l in lists:
    zero_one = map(int, l)  # convert True to 1, False to 0  using `int`
    n = int(''.join(map(str, zero_one)), 2)  # numbers to strings, join them
                                             # convert to number (base 2)
    print('{:02x}'.format(n))  # format them as hex string using `str.format`

输出结果:

e4
c9
93
27
4e
9c
39
72

撰写回答