2010-04-14 27 views
5

¿Cómo convierto esto:convertir una lista de booleanos a cadena

[True, True, False, True, True, False, True] 

En esto:

'AB DE G' 

Nota: C y F no están presentes en la salida debido a que los elementos correspondientes en la entrada la lista es falsa

Respuesta

10

Asumiendo que su lista de booleanos no es demasiado largo:

bools = [True, True, False, True, True, False, True] 

print ''.join(chr(ord('A') + i) if b else ' ' for i, b in enumerate(bools)) 
+1

Se puede reemplazar con 65 ord ('A') – compie

+0

Sí, ord ('A') es más clara. Cambiará. –

+0

+1 Agradable. :) –

3
In [1]: ''.join(map(lambda b, c: c if b else ' ', 
        [True, True, False, True, True, False, True], 
        'ABCDEFG')) 
Out[1]: 'AB DE G' 
2
inputs = [True, True, False, True, True, False, True] 
outputs = [] 
for i,b in enumerate(inputs): 
    if b: 
    outputs.append(chr(65+i)) # 65 = ord('A') 
    else: 
    outputs.append(' ') 
outputstring = ''.join(outputs) 

o la lista de la comprensión versión

inputs = [True, True, False, True, True, False, True] 
outputstring = ''.join(chr(65+i) if b else ' ' for i,b in enumerate(inputs)) 
+0

Preferiría enumerar (...) en lugar de rango (len (...)). –

+0

También, 97 -> 65 para letras mayúsculas :) –

+0

Tienes razón, es tarde y se me olvidó. He revisado el mío, pero también he votado a favor. :) – Amber

9

Se puede utilizar en lugar de string.uppercase CHR/ord. Esto le dará resultados que dependen de la configuración regional. Para ascii puedes usar string.ascii_uppercase.

>>> import string 
>>> bools = [True, True, False, True, True, False, True] 
>>> ''.join(string.uppercase[i] if b else ' ' for i, b in enumerate(bools)) 

'AB DE G' 
+1

+1 por 'string.uppercase' –

+0

@miles: no necesita comprensión de lista allí – SilentGhost

+0

@SilentGhost: Tiene razón, es redundante. Lo he quitado ahora, gracias. – miles82

0

solución Aquí está generalizado basado en numpy.where():

#!/usr/bin/env python 
import string, itertools 

def where(selectors, x, y): 
    return (xx if s else yy for xx, yy, s in itertools.izip(x, y, selectors)) 

condition = [True, True, False, True, True, False, True] 
print ''.join(where(condition, string.uppercase, itertools.cycle(' '))) 
# -> AB DE G 

import numpy as np 
print ''.join(np.where(condition, list(string.uppercase)[:len(condition)], ' ')) 
# -> AB DE G