Tengo una lista de respuestas verdaderas y falsas como esta:

[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]

Quiero darle a True un valor de 1 y False un valor de 0 y luego convertir ese valor general a hexadecimal. ¿Cómo voy a hacer eso? ¿Podría mirar cada valor por turno en la lista y si es igual a 'Verdadero' cambiar ese valor a 1 y si es 'Falso' cambiar el valor a 0 o habría una manera más fácil de cambiar toda la lista directamente a ¿maleficio?

EDITAR: Aquí está el código completo en Pastebin: http://pastebin.com/1839NKCx

Gracias

3
Tom Pitts 30 ago. 2014 a las 18:17

5 respuestas

La mejor respuesta
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`

Salida:

e4
c9
93
27
4e
9c
39
72
6
falsetru 30 ago. 2014 a las 14:22

No necesita un proceso de dos pasos si utiliza reduce (suponiendo que MSB está a la izquierda como de costumbre):

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

print val
print hex(val)

Mostrando:

228
0xe4
1
Sylvain Leroux 30 ago. 2014 a las 14:31

Un trazador de líneas:

>>> 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'

La unión interna produce una cadena de ocho ceros y unos.

Int (foo, 2) convierte la cadena en un número interpretándola como binaria.

Hex lo convierte a formato hexadecimal.

[2:] elimina el '0x' inicial del formato hexadecimal estándar

La unión externa hace esto a todas las sublistas y, bueno, une los resultados.

0
Emilio M Bumachar 30 ago. 2014 a las 14:40

Esto debería hacerlo:

def bool_list_to_hex(list):
  n = 0
  for bool in list:
    n *= 2
    n += int(bool)
  return hex(n)
0
olleicua 30 ago. 2014 a las 14:25

Si desea combinar una serie de valores booleanos en un valor (como un campo de bits), puede hacer algo como esto:

x = [True, False, True, False, True, False ]
v = sum(a<<i for i,a in enumerate(x))
print hex(v)
1
khelwood 30 ago. 2014 a las 14:23