si20004
@si20004

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!

appendがおかしい

解決したいこと

pythonで空の配列「z」にprint(b)で表示される配列「b」の中身をappendで追加していきたいと思っているのですがうまくいきません。
なぜかappendで追加した後の配列の要素数が2つ増えちゃったりしてしまいます。(笑)
print(b)で表示される要素をそのまま追加するにはどうしたらいいですか?
詳しい方いましたらよろしくお願いします。
※入力値は++-+--+++- +--+です。

入力に対する出力の想定

上記に述べた++-+--+++- +--+を例に説明します。
ここでは入力値の空白より左側を⓵、右側を⓶とします。
⓵(++-+--+++-)の各要素を右側と左側にある「+-」の組み合わせで⓶(+--+)の各要素の通りに更新するという操作を無限に繰り返し、入力されたときの形⓵(++-+--+++-)に戻ってこれるなら"YES"戻ってこれないなら"NO"を出力するというのが本来の目的です。
「+-」の組み合わせによる要素の変更は以下の通りです。
左が「-」右が「-」のときは⓶の1文字目に更新
左が「-」右が「+」のときは⓶の2文字目に更新
左が「+」右が「-」のときは⓶の3文字目に更新
左が「+」右が「+」のときは⓶の4文字目に更新
また⓵の一文字目にとっての左側は⓵の末尾、⓵の末尾にとっての右側は⓵の一文字目というルールになっています。

なぜ「z」に配列「b」の中身をappendしたいのか

まず、⓵に戻ってこれない場合がどのようなときなのかを考えました。
いろいろ考えた結果、「⓵の更新後に、入力されたときの形以外で繰り返されたものがあったとき」は⓵に戻ってこれないだろうと思ったので、これを表現するために⓵が更新されるたびにそれらを一つ一つ記憶し、新しい更新後のデータと記憶してきたすべてのデータを照らし合わせることを思いつきました。
「z」が記憶装置、「b」の中身が更新後のデータというイメージです。
なので私は「z」に「b」をappendしたいのです。

発生している問題・出力結果

['-', '-', '+', '+', '-', '-', '-', '+', '-', '+']
[['-', '-', '+', '+', '-', '-', '-', '+', '-', '+']]
['-', '-', '-', '-', '-', '+', '-', '+', '+', '+']
[['-', '-', '+', '+', '-', '-', '-', '+', '-', '+', '-', '-'], ['-', '-', '-', '-', '-', '+', '-', '+', '+', '+']]
['-', '+', '+', '+', '-', '+', '+', '-', '+', '-']
[['-', '-', '+', '+', '-', '-', '-', '+', '-', '+', '-', '-'], ['-', '-', '-', '-', '-', '+', '-', '+', '+', '+', '-', '-'], ['-', '+', '+', '+', '-', '+', '+', '-', '+', '-']]
['-', '-', '+', '-', '+', '-', '-', '+', '+', '-']
[['-', '-', '+', '+', '-', '-', '-', '+', '-', '+', '-', '-'], ['-', '-', '-', '-', '-', '+', '-', '+', '+', '+', '-', '-'], ['-', '+', '+', '+', '-', '+', '+', '-', '+', '-', '-', '-'], ['-', '-', '+', '-', '+', '-', '-', '+', '+', '-']]
['+', '-', '+', '+', '+', '-', '-', '-', '-', '-']
[['-', '-', '+', '+', '-', '-', '-', '+', '-', '+', '-', '-'], ['-', '-', '-', '-', '-', '+', '-', '+', '+', '+', '-', '-'], ['-', '+', '+', '+', '-', '+', '+', '-', '+', '-', '-', '-'], ['-', '-', '+', '-', '+', '-', '-', '+', '+', '-', '-', '-'], ['+', '-', '+', '+', '+', '-', '-', '-', '-', '-']]
YES

プログラムコード

a = input().split(" ")
b = list(a[0])
b1 = list(a[0])
c = list(a[1])
x = []
y = []
z = []
for i in b:
    x.append(i)


for i in x:
    y.append(i)


while True:
    d = 0
    
    for i in range(len(b)):
        if b[d-1] == "-" and b[d+1] == "-":
            x[d]=c[0]
        
        if b[d-1] == "-" and b[d+1] == "+":
            x[d]=c[1]
        
        if b[d-1] == "+" and b[d+1] == "-":
            x[d]=c[2]
    
        if b[d-1] == "+" and b[d+1] == "+":
            x[d]=c[3]
        d+=1
        if d == len(b)-1:
            b.append(b[0])
        
    
    if x == y:
        print("YES")
        break
    
    b = []
    for i in x:
        b.append(i)
    print(b)
    z.append(b)
    print(z)
    

自分で試したこと

理屈はわからないですがなんとなくコードの最後らへんにある
if d == len(b)-1:
 b.append(b[0])
っていうコードが原因なのかなと思ったので、このコードを消した後,エラーにならないように真ん中らへんにある
for i in range(len(b)):をfor i in range(len(b)-1):に変更して実行するとprint(b)で表示される要素がそのまま追加されるんですよねぇ。。。(笑)
z.appendの前にb = []と書いていますし「x」の要素数も毎度変わりないはずなのになぜ
f d == len(b)-1:
 b.append(b[0])
が影響してるような状況になってしまうのでしょうか。
そもそもなぜ直前にprint(b)表示している「b」の配列がz.append後には違くなったりしちゃうのでしょうか。

0

2Answer

zにappendしたオブジェクトに対してb.append(b[0])をしてるので後ろに2つ要素が追加されています。

import copyを先頭行に追加し

z.append(b)を
z.append(copy.deepcopy(b))
とすると意図した動作になるのではないでしょうか。

この辺はshallow copyとdeep copyについて調べるとわかりやすい解説が得られると思います。

1Like

Comments

  1. @si20004

    Questioner

    ありがとうございます。
    解決しました。

回答の前にどのような入力に対してどのような出力を想定されておられるのでしょうか?
バグ修正というのは狙った動作をしていないところに対して行わなければなりませんので,どのような動作をするのが正しいのか共有していただかないことにはこちらも助言できかねます.
その要件設定がはっきりしていないという場合,そもそも設計から見直さなければならないということにもなりかねません.

0Like

Comments

  1. @si20004

    Questioner

    回答ありがとうございます。
    投稿内容修正しましたのでもしよろしければもう一度閲覧、回答のほどよろしくお願いします。

Your answer might help someone💌