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
5 respuestas
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
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
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.
Esto debería hacerlo:
def bool_list_to_hex(list):
n = 0
for bool in list:
n *= 2
n += int(bool)
return hex(n)
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)
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.