将True和False答案的数组更改为十六进制值Python

时间:2014-08-30 14:17:18

标签: python

我有一个像这样的真假答案列表:

[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

由于

6 个答案:

答案 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 ]