4

同じ長さの文字列とバイナリリストの場合、次に例を示します。

[0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0]
 s  t  a  c  k  o  v  e  r  f  l  o  w

-t-c-over----次のように新しい文字列を取得することは可能ですか?

[0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0]
 -  t  -  c  -  o  v  e  r  -  -  -  -

つまり、と一致する各文字は0として置き換えられ-ます。1必要な出力は、文字が一致し、ハイフンが一致する以下のリスト0が個別にグループ化されます。

['-', 't', '-', 'c', '-', 'over', '----']

ありがとう!

4

4 に答える 4

4

このようなものはどうですか?2つのリストを圧縮し、出力を繰り返してビルドします。最後のバイナリ値を保持して、追加するか連結するかを決定します。

blist = [0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0]
string = 'stackoverflow'
output = []    
previous = not blist[0] # to cause the first char to be appended

for b,s in zip(blist, string):
    char = '-' if b == 0 else s

    if previous == b:
        output[-1] += char         
    else:
        output.append(char)

    previous = b

print(output)

別のオプションは正規表現です:

import re

blist = [0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0]
string = 'stackoverflow'

x = ''.join(['-' if b == 0 else s for b,s in zip(blist, string)])
output = re.findall('(-+|[a-z]+)', x)

print(output)
于 2013-03-02T02:05:31.240 に答える
3

イテレータを楽しむことができます(zipは必要ありません!:)

it = iter([0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0])
s = 'stackoverflow'

output = [''.join(('-' for i in b) if not a else b)
          for a,b in 
          itertools.groupby(s, key=lambda x: next(it))]

したがって、出力は次のようになります。

['-', 't', '-', 'c', '-', 'over', '----']
于 2013-03-02T02:16:46.790 に答える
1

あなたはこれを行うことができます:

string = "stackoverflow"
arr = [0,1,1,0,1,0,1,0,1,0,0,1,0]
new = ""
for i in range(len(arr)):
    new += string[i]*arr[i] +"-"*(abs(arr[i]-1))

これは、文字列に0を掛けたものが空の文字列であることを利用しています。

次に、正規表現を使用して文字列のリストに分割できます

import re
list = re.findall("-+|[A-z]+", new)

"-+|[A-z]+"1を超える長さのダッシュの文字列または1を超える長さの文字の文字列のいずれかである一致パターン。

于 2013-03-02T05:32:40.870 に答える
1

あなたの最後の質問への答えは、望ましい結果を得るためにわずかに修正されている可能性があります

最初の答え:

与えられた

[''.join(v) for k, v in groupby(st, key = lambda e:next(it_lst))]

変更

[''.join(v if k else ('-' for _ in v)) 
 for k, v in groupby(st, key = lambda e:next(it_lst))]

2番目の回答

与えられた

[''.join(zip(*v)[-1]) 
 for k, v in groupby(zip(lst, st), key = itemgetter(0)) if k]

変更

[''.join(zip(*v)[-1] if k else ('-' for _ in v)) 
 for k, v in groupby(zip(lst, st), key = itemgetter(0))]

あなたがする必要があるのはすることだけです

  1. 0エントリを無視するのをやめます
  2. 0エントリについて、下のグループ化された文字列に等しい長さの文字列を作成します0
于 2013-03-02T04:04:45.777 に答える