将字符串中的字符与二进制列表匹配

时间:2013-03-01 05:17:09

标签: python

使用字符串abcdefg和列表[1, 1, 0, 0, 1, 1, 0],什么是Pythonic方法返回列表中与1 (on)匹配的字符串中的所有字符?

所需的输出将是:

['a', 'b', 'e', 'f']

谢谢!

修改

还有一个问题,是否可以对abef进行分组,以便输出看起来像这样:['ab', 'ef']?基本上,我们的想法是将0分隔的字符分组。如果没有0,那么它将是['abcdefg']。谢谢!

4 个答案:

答案 0 :(得分:4)

您可以将itertools.compress用于此目的

>>> from itertools import compress
>>> list(compress("abcdefg", [1, 1, 0, 0, 1, 1, 0]))
['a', 'b', 'e', 'f']

如果您不想导入任何模块,也可以使用

>>> [e for e, i in zip("abcdefg", [1, 1, 0, 0, 1, 1, 0]) if i]
['a', 'b', 'e', 'f']

根据您的最新要求

>>> from itertools import groupby
>>> st = "abcdefghijklm"
>>> some_list = [1,1,0,0,0,1,1,1,0,0,0,1,0]
>>> it_l = iter(some_list)
>>> [''.join(v) for k, v in groupby(st, key = lambda e:next(it_l)) if k]
['ab', 'fgh', 'l']

或更好

>>> [''.join(zip(*v)[-1]) for k, v in groupby(zip(some_list, st), key = itemgetter(0)) if k]
['ab', 'fgh', 'l']

答案 1 :(得分:2)

[x[0] for x in zip("abcdefg", [1, 1, 0, 0, 1, 1, 0]) if x[1]]

答案 2 :(得分:1)

三种解决方案:

s = 'abcdefg'
li = [1, 1, 0, 0, 1, 1, 0]

print [c for i,c in enumerate(s) if li[i]]

print [s[i] for i,b in enumerate(li) if b]

it = iter(li)
print [c for c in s if it.next()]

我首选的是iter():没有zip,没有枚举,没有itertools

答案 3 :(得分:1)

关于您的更新 - 您使用itertools.groupby来标识连续值的运行,并从中构建列表 - 例如:

text = 'abcdefg'
bits = [1, 1, 0, 0, 1, 1, 0]

from itertools import groupby
print [''.join(el[0] for el in g) for k, g in groupby(zip(text, bits), lambda L: L[1]) if k]
# ['ab', 'ef']