worldwide_tomoya
@worldwide_tomoya (ともや)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Pythonで文字列操作をしたい

解決したいこと

Pythonで以下のような操作をしたいと考えています.実装にあたり詰まってしまった場所があるので教えていただきたいです.

「0,1のいずれかの数値が1/2ずつの確率で出現する数列を生成し,その数列において,1が5回連続して現れた場合に直後に0を代入する」というものです.

乱数の発生から数列の生成までは成功したのですが0を代入する操作をどう実行するのかわからないため教えていただけると幸いです.現状のソースコードは以下です.

該当するソースコード

import random
def bit():
    return 1 if random.random() >= 0.5 else 0
a = []
for i in range(0,1000):
    a.append(bit())
b = ''.join(map(str, a))
print(b)



0

3Answer

ちょっと汚いコードですが、これでやりたい事と合致しているでしょうか?
実行結果のb_zeroaddが1が5回連続して現れた場合に直後に0を代入した結果です。
(1箇所1が5回連続しているところがあり、直後に0を追加しているので、その分結果が長くなっています)
ちなみにfor文100回繰り返しの結果になります。

「0,1のいずれかの数値が1/2ずつの確率で出現する数列を生成し,その数列において,1が5回連続して現れた場合に直後に0を代入する」というものです.

import random

# 1が"CHECKCOUNT"回連続で出る
CHECKCOUNT = 5

def bit():
    return 1 if random.random() >= 0.5 else 0

if __name__ == '__main__':
    a = []
    # 比較用配列追加
    a_zeroadd = []
    check = 0

    # forを100までに変更
    for i in range(0,100):
        # 1が連続回数で出た回数をcheckでカウント(0がでたらcheckを0で初期化)
        c = bit()
        if c == 1:
            check += 1
        else:
            check = 0

        # checkが5回連続で出たら0を直後に代入する
        if check >= CHECKCOUNT:
            a.append(c)
            # a_zeroadd:比較用の配列
            a_zeroadd.append(c)
            a_zeroadd.append(0)
            check = 0
        else:
            a.append(c)
            a_zeroadd.append(c)
    b = ''.join(map(str, a))
    b_zeroadd = ''.join(map(str, a_zeroadd))
    print("b")
    print(b)
    print("b_zeroadd")
    print(b_zeroadd)
実行結果
b
0001110100001111001000100110000001010111000111111100110011100010010000110011110100100101001001100101
b_zeroadd
00011101000011110010001001100000010101110001111101100110011100010010000110011110100100101001001100101
0Like

Comments

  1. ありがとうございます!最初に文字列を作ってから操作しようとしたせいでこのやり方は全く浮かんでいませんでした.一つ一つ乱数を発生させてカウントしていく方針だと明確ですね.すぐに回答いただきありがとうございました.m(_ _)m
  2. ちょっと分かりづらいコードでしたが、お役に立ったようでよかったです

replaceやsplitを使うのはいかがでしょう?

import random

s = ''.join(random.choice('01') for _ in range(1000))
print(len(s), s)
t = s.replace('11111', '111110')
print(len(t), t)
u = '111110'.join(s.split('11111'))
print(len(u), u)

ループで生成するならこんな手も。

import random

def zeroone(n, oneslimit=5):
    s = ''
    ones = 0
    while len(s) < n:
        s += random.choice('01')
        if s[-1] == '1':
            ones += 1
            if ones >= oneslimit and len(s) < n:
                s += '0'
                ones = 0
    return s

s = zeroone(1000)
print(len(s), s)
0Like

正規表現を用いて文字列操作するのが良いかと思います。
提示されたコードに以下の処理を加えてみたらいかがでしょうか。

b = re.sub('1{5}', '111110', b)

補足すると、11111(1が5回連続する文字列)を111110(1が5回連続する文字列の直後に0)へ置換しています。

0Like

Your answer might help someone💌