質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

825閲覧

リスト変数をforループ内で更新 / 元に戻したい

kay_ventris4

総合スコア269

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/04/17 06:44

編集2021/04/17 06:46

#問題
イメージ説明
イメージ説明
AtCoder ABC190 C問題より

#方針(途中まで、関係あるところのみ)
入力例1に従うと、

・C,DをCD = [list(map(int, input().split())) for _ in range(K)]として[[1, 2], [1, 3], [2, 3]]のような二重リストに格納する。

・itertools.productを用いて、CDの要素リストを、ビット全探索を用いてそのそれぞれの0番目または1番目の値で書き換えたものに更新し、printする。

・1つ出力したら書き換えられたCDを元に戻して、同様の作業を2^3回繰り返す。

#コード
ここではとりあえず、ビット全探索を用いてCDが2^3回期待通り書き換えられているかを、それぞれを全て出力することで確認することを目標とする:

Python

1from itertools import product 2 3N, M = map(int, input().split()) #4 4 4 5#[[1, 2], [1, 3], [2, 4], [3, 4]] 6AB = [list(map(int, input().split())) for _ in range(M)] 7 8K = int(input()) #3 9 10#[[1, 2], [1, 3], [2, 3]] 11CD = [list(map(int, input().split())) for _ in range(K)] 12 13_CD = CD 14 15#[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)] 16for bit in list(product([0, 1], repeat = K)): 17 CD = _CD 18 for ind, to_place in enumerate(bit): 19 CD[ind] = CD[ind][to_place] 20 print(CD)

#出力エラー

Terminal

1[1, 1, 2] 2Traceback (most recent call last): 3 CD[ind] = CD[ind][to_place] 4TypeError: 'int' object is not subscriptable

#試行錯誤
出力エラーによると、(0, 0, 0)のパターン([1, 1, 2])だけうまくいっていることがわかります。しかしながら、(0, 0, 1)のパターン([1, 1, 3])以降で失敗しています。どうやら一重リストに更新されてしまったCDを元input()した二重リストにうまく戻せていないようで、_CD = CDとして保存した_CDを用いて1つ目及び2つ目のforループの中や外に色々配置してみたのですが、どうやってもnot subscriotableエラーから抜け出せません。どのような箇所を修正すればうまくいくのでしょうか。素人質問で恐縮ですが、ご教授お願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

_CD = CD
CD = _CD
は_CDとCDが同じオブジェクトを見るようにしているだけです。

バックアップを取りたいなら、

_CD = CD.copy()
CD = _CD.copy()

としなければなりません。

投稿2021/04/17 07:27

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まとめとしてですが、_CD = CD.copy()としてまずバックアップを取って、かつCD = _CDとしてしまうと結局二つのリストは同じオブジェクトを参照してしまうとのことで、forを用いてCDの各要素を_CDの各要素で書き換えるということをすることで実装することが出来ました:

Python

1from itertools import product 2 3N, M = map(int, input().split()) #4 4 4 5#[[1, 2], [1, 3], [2, 4], [3, 4]] 6AB = [list(map(int, input().split())) for _ in range(M)] 7 8K = int(input()) #3 9 10# [[1, 2], [1, 3], [2, 3]] 11CD = [list(map(int, input().split())) for _ in range(K)] 12 13_CD = CD.copy() 14 15for bit in list(product([0, 1], repeat = K)): 16 for ind, to_place in enumerate(bit): 17 CD[ind] = CD[ind][to_place] 18 print(CD) 19 for i in range(K): 20 CD[i] = _CD[i]

出力:

Python

1[1, 1, 2] 2[1, 1, 3] 3[1, 3, 2] 4[1, 3, 3] 5[2, 1, 2] 6[2, 1, 3] 7[2, 3, 2] 8[2, 3, 3]

投稿2021/04/17 13:37

kay_ventris4

総合スコア269

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問