2013-03-01 106 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']