2014-08-30 70 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