Supongo que con "cadena binaria" en realidad quiere decir una cadena normal (es decir, texto) cuyos elementos son todos '0' o '1'.
Así que para los puntos 1 y 2,
row = [thestring[i:i+3] for i in xrange(0, len(thestring), 3)]
, por supuesto, el último elemento será solamente 1 o 2 caracteres de longitud si len(thestring)
no es un múltiplo exacto de 3, eso es inevitable ;-).
Para los puntos 3 y 4, me gustaría sugerir la construcción de un diccionario de temperatura auxiliar y almacenarlo:
aux = {}
for x in range(8):
s = format(x, 'b')
aux[s] = x
aux[('00'+s)[-3:]] = x
de manera que los puntos 3 y 4 sólo se convertirá en:
numbers = [aux[x] for x in row]
Esta búsqueda debe dict será mucho más rápido que convertir cada entrada sobre la marcha.
Editar: se ha sugerido que explicar por qué estoy haciendo dos entradas en aux
para cada valor de x
. El punto es que s
puede tener cualquier longitud de 1 a 3 caracteres, y para las cortas quiero dos entradas, una con s
como tal (porque como mencioné, el último elemento en row
bien puede ser más corto que 3 ...), y uno con el izquierdo acolchado a una longitud de 3 con 0
s.
El sub-expresión ('00'+s)[-3:]
computa "s izquierda-acolchado con 'de 0 a una longitud de 3" mediante la adopción de los 3 últimos caracteres (que es la parte [-3:]
slicing) de la cadena obtenida mediante la colocación de ceros a la izquierda de s
(esa es la parte '00'+s
). Si s
ya tiene 3 caracteres, toda la subexpresión será igual a s
, por lo que la asignación a esa entrada de aux
es inútil pero inofensiva, por lo que me resulta más sencillo ni siquiera molestarme en verificar (anteponer un if len(s)<3:
también estaría bien, cuestión de gustos; -).
Hay otros enfoques (por ejemplo, formatear x
de nuevo si es necesario) pero este no es el meollo del código (se ejecuta solo 8 veces para construir la "tabla de búsqueda" auxiliar, después de todo ;-), entonces no lo hice le presto suficiente atención.
... ni hice una prueba de unidad, por lo que tiene un error en una caja de esquina oscura. Puedes verlo...?
Supongamos que tiene row
'01'
como la última entrada: esa llave, después de que mi código está construida ha aux
, no estará presente en aux
(tanto 1
y 001
será, pero eso es consuelo escasa ;-). En el código anterior utilizo el original s
, '1'
, y la versión acolchada de longitud tres, '001'
, pero la versión intermedia de longitud dos, ¡oops!, Se pasó por alto ;-).
lo tanto, aquí es una forma correcta de hacerlo ...:
aux = {}
for x in range(8):
s = format(x, 'b')
aux[s] = x
while len(s) < 3:
s = '0' + s
aux[s] = x
... sin duda más simple y más obvia, pero, más importante aún, CORRECTO ;-).
y ** ¿cómo estás tratando de hacer esto? o deberíamos simplemente darte el c0dez? – SilentGhost
Publicaré lo que tengo hasta ahora, aunque probablemente sea la forma incorrecta de hacerlo. – AME