ゼロと境界要素(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]
ゼロと境界要素(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]
はあなたがあなたのlist
str
に変換し、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]
メモリの問題を起こさない小さなリストがあれば、少し複雑に見えますが、うまく動作します。
[1,0,0,1,0,0,1]の場合、[1,1,1,1,0,0,1]となります。しかし私は解決策が好きです。この小さな問題 –
Hmを修正しようとするので、中央の1が両側の境界であると仮定しますか? – Selcuk
はい、[1,0,0,1,0,0,1]の出力は[1,1,1,1,1,1]になります。 –
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]
これは魅力として機能します。ありがとうございます –
をあなたが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)
になるよう、あなたは同僚
'zeros_found ++'はPythonでは動作しません。正しい構文は 'zeros_found + = 1'です。 –
+ = 1にする必要があります。それでも、[1,0,0,1,1,0,0,1,0,0,1] 0を取り除くと失敗します –
@ Farhan.Kの増分フォルトを指摘してくれてありがとうございます。更新された回答 – Ian2thedv
あなたができるランレングス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]
次の「1」が表示されるまで、各要素ごとにループし、ゼロを数える純粋な解のみが表示されます。それから戻って1人で満たしてください。おそらくそれを行うための1つのライナーがあるかもしれないと思っていた。 –