将布尔值列表转换为字符串

6
我该如何转换这个代码:
[True, True, False, True, True, False, True]

转换为:

'AB DE G'

注意:输出中缺少C和F,因为输入列表中对应的项为False。
5个回答

11

假设你的布尔列表不太长:

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

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

1
你可以用 ord('A') 替换 65 - compie

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'

@miles:你不需要在那里使用列表推导式。 - SilentGhost
@SilentGhost:你说得对,这是冗余的。我已经把它删掉了,谢谢。 - miles82

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

我更喜欢使用enumerate(...)而不是range(len(...))。 - Gary Kerr
此外,大写字母的 ASCII 码值从 97 变为 65 :) - Gary Kerr
你说得对,现在有点晚了,我忘记了。我已经修改了我的,但我也给你的点了赞。 :) - Amber
谢谢。对我来说还很早,所以可能我有不公平的优势! - Gary Kerr

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接