使用 stringabcdefg
和 list [1, 1, 0, 0, 1, 1, 0]
,返回字符串中与1 (on)
列表中匹配的所有字符的 Pythonic 方法是什么?
所需的输出将是:
['a', 'b', 'e', 'f']
谢谢!
编辑:
还有一个问题,是否可以进行分组ab
,ef
使输出看起来像这样:['ab', 'ef']
?基本上,这个想法是将由 . 分隔的字符分组0
。如果没有0
,那就是['abcdefg']
。谢谢!
使用 stringabcdefg
和 list [1, 1, 0, 0, 1, 1, 0]
,返回字符串中与1 (on)
列表中匹配的所有字符的 Pythonic 方法是什么?
所需的输出将是:
['a', 'b', 'e', 'f']
谢谢!
编辑:
还有一个问题,是否可以进行分组ab
,ef
使输出看起来像这样:['ab', 'ef']
?基本上,这个想法是将由 . 分隔的字符分组0
。如果没有0
,那就是['abcdefg']
。谢谢!
您可以为此目的使用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']
[x[0] for x in zip("abcdefg", [1, 1, 0, 0, 1, 1, 0]) if x[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、没有枚举、没有 itertool
关于您的更新 - 您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']