與字符串abcdefg
和列表[1, 1, 0, 0, 1, 1, 0]
什麼是Pythonic方法返回字符串中與列表中的1 (on)
匹配的所有字符?字符串中的匹配字符與二進制列表
所需的輸出將是:
['a', 'b', 'e', 'f']
謝謝!
編輯:
還有一個問題,是有可能組ab
和ef
使輸出會是這個樣子:['ab', 'ef']
?基本上這個想法是對由0
分開的字符進行分組。如果沒有0
那麼它將是['abcdefg']
。謝謝!
與字符串abcdefg
和列表[1, 1, 0, 0, 1, 1, 0]
什麼是Pythonic方法返回字符串中與列表中的1 (on)
匹配的所有字符?字符串中的匹配字符與二進制列表
所需的輸出將是:
['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()]
我的首選之一是一個與國際熱核實驗堆():無壓縮,無枚舉,沒有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']
答案有多個s tyles。我想我們都不是荷蘭人。 「應該有一種 - 最好只有一種 - 明顯的做法,儘管這種方式一開始可能並不明顯,除非你是荷蘭人。」 – minopret 2013-03-02 16:25:06