我有一个像这样的真假答案列表:
[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,然后将该整体值转换为十六进制。 我该怎么做呢?我可以在列表中依次查看每个值,如果它等于'True',则将该值更改为1,如果其'False'将值更改为0,或者是否有更简单的方法可以将整个列表直接更改为十六进制?
编辑:这是关于Pastebin的完整代码:http://pastebin.com/1839NKCx
由于
答案 0 :(得分:6)
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
答案 1 :(得分:1)
如果您使用reduce
(假设MSB像往常一样在左边),则无需执行两个步骤:
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
答案 2 :(得分:1)
如果要将一系列布尔值组合成一个值(作为位域),可以执行以下操作:
x = [True, False, True, False, True, False ]
v = sum(a<<i for i,a in enumerate(x))
print hex(v)
答案 3 :(得分:0)
这应该这样做:
def bool_list_to_hex(list):
n = 0
for bool in list:
n *= 2
n += int(bool)
return hex(n)
答案 4 :(得分: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'
外部联接对所有子列表执行此操作,并且加入结果。
答案 5 :(得分:0)
如果位列表超过 64,以上所有方法都不起作用。 也可以讨论在转换为hexa之前多次转换boolean特别是string是否有效。
这是一个提案,位列表左侧的 MSB 为:
from collections import deque
# (lazy) Padd False on MSB side so that bitlist length is multiple of 4.
# Padded length can be zero
msb_padlen = (-len(bitlist))%4
bitlist = deque(bitlist)
bitlist.extendleft([False]*msb_padlen)
# (lazy) Re-pack list of bits into list of 4-bit tuples
pack4s = zip(* [iter(bitlist)]*4)
# Convert each 4-uple into hex digit
hexstring = [hex(sum(a<<i for i,a in enumerate(reversed(pack4))))[-1] for pack4 in pack4s ]
# Compact list of hex digits into a string
hexstring = '0x'+''.join(hexstring)
4 位元组 pack4 是 (msb,...,lsb) => 在计算相应整数时必须将其反转。
替代:
hexstring = [hex(sum(a<<3-i for i,a in enumerate(pack4)))[-1] for pack4 in pack4s ]