1

文字列abcdefgとリスト[1, 1, 0, 0, 1, 1, 0]を使用して、リスト内で一致する文字列内のすべての文字を返すPythonicの方法は何1 (on)ですか?

必要な出力は次のとおりです。

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

ありがとう!

編集:

もう1つの質問ですが、グループabefして、出力が次のようになるようにすることは可能['ab', 'ef']ですか?基本的には、で区切られた文字をグループ化するという考え方です0。いいえの場合は0、になります['abcdefg']。ありがとう!

4

4 に答える 4

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']
于 2013-03-01T05:18:34.083 に答える
2
[x[0] for x in zip("abcdefg", [1, 1, 0, 0, 1, 1, 0]) if x[1]]
于 2013-03-01T05:20:20.850 に答える
1

3 つのソリューション:

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なし、enumerateなし、itertoolなし

于 2013-03-01T05:43:47.283 に答える
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']
于 2013-03-01T06:16:56.627 に答える