2010-04-14 78 views

回答

10

假設你的布爾值的列表不是太長:

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

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

您可以替換65以ord( 'A') – compie 2010-04-14 09:04:51

+0

是,ORD( 'A')更清晰。會改變。 – 2010-04-14 09:14:10

+0

+1不錯的一個。 :) – 2010-04-14 12:04:56

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) 

或列表解析版本

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

我寧願列舉(...)而不是範圍(len(...))。 – 2010-04-14 08:50:58

+0

另外,97 - > 65爲大寫字母:) – 2010-04-14 08:52:21

+0

你是對的,它已經很晚了,它讓我的腦海裏滑了下來。我修改了我的,但我也贊成你的。 :) – Amber 2010-04-14 08:52:56

9

可以使用string.uppercase代替CHR/ORD。這會給你與語言環境相關的結果。對於ascii,你可以使用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 for'string.uppercase' – 2010-04-14 09:49:03

+0

@miles:你不需要列表理解 – SilentGhost 2010-04-14 10:07:36

+0

@SilentGhost:你是​​對的,它是多餘的。我已經刪除它,謝謝。 – miles82 2010-04-14 10:14:17

0

基於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