2016-04-19 9 views
0

ゼロと境界要素(1)のリストが与えられた場合、Pythonリストの2つの境界記号の間にいくつかのリスト要素を置き換えるにはどうすればいいですか?

For N=3: 
[1,0,0,1,1,1,0,0,0,1,0,0,0] => [1,1,1,1,1,1,0,0,0,1,0,0,0] 

いくつかのより多くの例:

[1,0,0,1] => [1,1,1,1] 

[0,0,1] => [0,0,1] 

[1,0,0] => [1,0,0] 
+0

次の「1」が表示されるまで、各要素ごとにループし、ゼロを数える純粋な解のみが表示されます。それから戻って1人で満たしてください。おそらくそれを行うための1つのライナーがあるかもしれないと思っていた。 –

答えて

1

はあなたがあなたのliststrに変換し、replace方法を使用し、その後、listに戻って変換することができます:

data = [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0] 
n = 3 

repl = (("1" + "0" * i + "1", "1" + "1" * i + "1") for i in range(1, n)) 
data_str = "".join(str(i) for i in data) 
for r in repl: 
while True: 
    new_str = data_str.replace(r[0], r[1]) 
    if new_str == data_str: 
     break 
    else: 
     data_str = new_str 
new_data = list(int(s) for s in data_str) 
print(new_data) 

これは

印刷します
[1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0] 

メモリの問題を起こさない小さなリストがあれば、少し複雑に見えますが、うまく動作します。

+0

[1,0,0,1,0,0,1]の場合、[1,1,1,1,0,0,1]となります。しかし私は解決策が好きです。この小さな問題 –

+0

Hmを修正しようとするので、中央の1が両側の境界であると仮定しますか? – Selcuk

+0

はい、[1,0,0,1,0,0,1]の出力は[1,1,1,1,1,1]になります。 –

2

1の場合はインデックスを使用して、nの要素が離れているかどうかを確認できます。これは動作するはずです:

l = [1,0,0,1,1,1,0,0,0,1,0,0,0] 
n = 3 

indexList = [i for i,j in enumerate(l) if j ==1] 

for i in range(len(indexList)): 
    try: 
     if indexList[i+1] - indexList[i] < n+1: 
      tmp = [1 for j in range(indexList[i+1] - indexList[i])] 
      l[indexList[i]:indexList[i+1]] = tmp 

    except IndexError: 
     pass 

出力:

>>> l 
[1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0] 
+0

これは魅力として機能します。ありがとうございます –

1

をあなたがlistのスタック機能を使用することができます。追加はO(1)とpoping

data = [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0] 
n = 3 

new_data = [] 

zeros_found = 0 
for number in data: 
    if number == 0: 
     zeros_found += 1 
    elif 0 < zeros_found < n: 
     for i in range(0, zeros_found): 
      new_data.pop() 
     zeros_found = 0 

    new_data.append(number) 

data = new_data 

です

:とき count < Nその後、 count回ポップ、数字のリストを実行し、スタックに追加し、追加のゼロの数をカウントし、1は、以下のとき Nにそれを比較しますスタックから複雑さが O(N)になるよう、あなたは同僚

+0

'zeros_found ++'はPythonでは動作しません。正しい構文は 'zeros_found + = 1'です。 –

+0

+ = 1にする必要があります。それでも、[1,0,0,1,1,0,0,1,0,0,1] 0を取り除くと失敗します –

+0

@ Farhan.Kの増分フォルトを指摘してくれてありがとうございます。更新された回答 – Ian2thedv

1

あなたができるランレングスENCと協議した後、この溶液に

ガットかかわらず、余分なスペースを使用しますが、O(1)です

In [12]: import itertools 

In [13]: data = [1,0,0,1,1,1,0,0,0,1,0,0,0] 

In [14]: N = 3 

In [15]: def run_length_encode(it): 
    ...:  for k, g in itertools.groupby(it): 
    ...:   yield k, sum(1 for _ in g) 
    ...:   

In [16]: s = itertools.chain.from_iterable([1 if n < N else k]*n for k, n in run_length_encode(data)) 

In [17]: list(s) 
Out[17]: [1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0] 
関連する問題