2013-03-01 64 views
1

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

所需的输出将是:

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

谢谢!

编辑:

还有一个问题,是有可能组abef使输出会是这个样子:['ab', 'ef']?基本上这个想法是对由0分开的字符进行分组。如果没有0那么它将是['abcdefg']。谢谢!

+1

答案有多个s tyles。我想我们都不是荷兰人。 “应该有一种 - 最好只有一种 - 明显的做法,尽管这种方式一开始可能并不明显,除非你是荷兰人。” – minopret 2013-03-02 16:25:06

回答

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'] 
+0

酷!闪电般快! – Rock 2013-03-01 05:21:21

+0

是否可以将'ab'和'ef'分开,以便输出看起来像这样:'['ab','ef']'?谢谢! – Rock 2013-03-01 06:02:35

+0

@Rock那个'分离'怎么样?它看起来像“加入”给我。如果你更明确一点,它也会有所帮助 - 例如,对于'['a','b','e','f','g'],输出是什么? – 2013-03-01 06:06:45

2
[x[0] for x in zip("abcdefg", [1, 1, 0, 0, 1, 1, 0]) if x[1]] 
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()] 

我的首选之一是一个与国际热核实验堆():无压缩,无枚举,没有itertool

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']