2014-08-30 73 views
3

我有这样的真与假答案的列表:更改真假答案数组的十六进制值的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] 

我想给的1 True值和0值False然后将该整体值转换为十六进制。 我该怎么做呢?我是否可以在列表中依次查看每个值,如果它等于“真”,则将该值更改为1,如果它的“假”将值更改为0,还是有更简单的方法将整个列表直接更改为十六进制?

编辑:这里有引擎收录的全码:http://pastebin.com/1839NKCx

感谢

回答

4
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 
+0

忽略这一点,我是愚蠢的。 :) – 2014-08-30 14:25:12

+0

@JohnZwinck,我想你用字典对象覆盖了'map'。我在Python 2.7和Python 3.4中检查了这段代码。 – falsetru 2014-08-30 14:26:23

+0

+1对于我来说'int(...,base)' – 2014-08-30 14:28:26

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

因为'bool'是'int'的子类并且可以在算术操作中使用,所以您可以使用'bit'而不是'(1 if else else 0)'。如果你想明确,使用'int(bit)'。 – falsetru 2014-08-30 14:31:05

1

如果你想了一系列的布尔值合并为一个值(一个位域),你可以做这样的事情:

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

类似的:http://stackoverflow.com/a/4066807/4323 – 2014-08-30 14:25:49

+0

这是一种享受,但它现在 0x93 [真,假,假,假] 0x27 [真,假,假,假] [真,假,假[假,假,假,假,假,真,真] 0xc9 [假,假,假,假, ] 0x72 如何将所有这些十六进制值收集到一个字符串中? – 2014-08-30 14:32:15

0

这应该这样做:

def bool_list_to_hex(list): 
    n = 0 
    for bool in list: 
    n *= 2 
    n += int(bool) 
    return hex(n) 
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)将字符串转换为一个数字,将其解释为二进制数。

十六进制将其变成十六进制格式。

[2:]将删除标准的十六进制格式

外连接这样做是为了所有子列表的,那么,加入结果的前导0x'。

+0

''%x'%int(''。join('01'[b] for b in sum(lists,[])),2)' – falsetru 2014-08-30 14:46:52

+0

小心,这会给你不正确的结果,如果其中一个8二进制数组值小于10.这是因为hex()为这些值返回单个字符,如hex(1)=='1'而不是'01'。 @falsetru建议使用'%x'更好 - 实际上,您需要使用'%02x'来避免上述问题 – 2018-02-12 20:12:40