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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

4回答

855閲覧

二次元リストの要素の組み合わせ (一つの要素のリストのみ複数にする)

hirochem

総合スコア4

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2021/04/30 12:38

A, B, CおよびD, E, Fはそれぞれ、百の位、十の位、一の位の数字が入っていてそこから三桁の数字を作ります。

A, B, Cで構成される「146」を基準とします。

AをDに変えた場合の数、BをEに変えた場合の数、CをFに変えた場合の数の組み合わせを入れたリストを作成したいです。

説明が下手なため以下に具体例を示します。

Python

1A = [1] 2B = [4] 3C = [6] 4 5D = [2, 3] 6E = [5] 7F = [7, 8, 9] 8lst = []

このとき

Python

1lst=[[2, 4, 6], [3, 4, 6], [1, 5, 6], [1, 4, 7], [1, 4, 8], [1, 4, 9]]

というリストを作成したいです。

まず百の位をDから取得し、残りは元のB, Cから取得
次に十の位のみEから取得し、残りは元のA, Cから取得
最後に百の位のみFから取得し、残りは元のB, Cから取得です。
D, Fはそれぞれ複数の要素が存在するため、これらは複数の数字ができます。

やってみたこと

Python

1import itertools 2A = [1] 3B = [4] 4C = [6] 5 6D = [2, 3] 7E = [5] 8F = [7, 8, 9] 9lst = [] 10 11tar= [] 12change = [] 13tar.append(A) 14tar.append(B) 15tar.append(C) 16change.append(D) 17change.append(E) 18change.append(F) 19#print(tar) 20i = 0 21while i < len(tar): 22 copy = tar 23 copy[i] = change[i] 24 itr = list(map(list, itertools.product(*copy))) 25 for a in itr: 26 lst.append(a) 27 i+=1 28print(lst)

これだとまずはDの要素 + B + C で三桁の数字が含まれたリストを作ったあとに
D + E + Cで作られた数字が出来てしまします。

説明がわかりにくくて申し訳ございません。

よろしくお願いします。

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

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

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

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

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

TakaiY

2021/04/30 12:43

質問は何ですか?
hirochem

2021/04/30 12:51

私のプログラミング能力では答えまでたどり着けそうにないため、私のプログラムのどこを、どのように直せばいいのか教えていただきたいです。 また、より簡単な解法があるならご教示いただければ幸いです。
guest

回答4

0

base が空でない前提がイマイチですが Python3.8 以降で内包表記を使った例です。

Python

1A = [1] 2B = [4] 3C = [6] 4 5D = [2, 3] 6E = [5] 7F = [7, 8, 9] 8 9lst = [D, E, F] 10base = A + B + C 11 12#ans = [v[:i]+[n]+v[i+1:] for i, ls in enumerate(lst) for n in ls if (v:=base[:])] 13ans = [base[:i]+[n]+base[i+1:] for i, ls in enumerate(lst) for n in ls] # 修正 14print(ans) # [[2, 4, 6], [3, 4, 6], [1, 5, 6], [1, 4, 7], [1, 4, 8], [1, 4, 9]]

投稿2021/04/30 14:41

編集2021/04/30 14:52
lehshell

総合スコア1147

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

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

hirochem

2021/05/01 11:19

ansが一行で表記できるとは思っていませんでした。一目では理解できないため、少し考えてみます!ありがとうございます。今後ともよろしくお願いします!
guest

0

listのみを使った場合です

python

1A = [1] 2B = [4] 3C = [6] 4 5D = [2, 3] 6E = [5] 7F = [7, 8, 9] 8 9origin = A+B+C 10data = [D,E,F] 11dst = [] 12for index, item in enumerate(data): 13 for num in item: 14 tmp = origin.copy() 15 tmp[index] = num 16 dst.append(tmp) 17 18assert dst == [[2, 4, 6], [3, 4, 6], [1, 5, 6], [1, 4, 7], [1, 4, 8], [1, 4, 9]] 19

投稿2021/04/30 15:08

taC-h

総合スコア289

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

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

hirochem

2021/05/01 11:21

辞書を使わなくてもenumerateを使えばいいんですね!ありがとうございます!
guest

0

ベストアンサー

内包表記で1行で作ってみました。(importを入れると2行です)

python

1from itertools import product 2lst = [[(A+D)[i], (B+E)[j], (C+F)[k]] for k, j, i in product(range(len(F)+1), range(len(E)+1), range(len(D)+1)) if i+j+k == max(i, j, k) and i+j+k != 0] 3print(lst)

実行結果

python

1>>> A = [1] 2>>> B = [4] 3>>> C = [6] 4>>> 5>>> D = [2, 3] 6>>> E = [5] 7>>> F = [7, 8, 9] 8>>> 9>>> from itertools import product 10>>> lst = [[(A+D)[i], (B+E)[j], (C+F)[k]] for k, j, i in product(range(len(F)+1), range(len(E)+1), range(len(D)+1)) if i+j+k == max(i, j, k) and i+j+k != 0] 11>>> print(lst) 12[[2, 4, 6], [3, 4, 6], [1, 5, 6], [1, 4, 7], [1, 4, 8], [1, 4, 9]]

投稿2021/04/30 15:02

ppaul

総合スコア24666

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

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

hirochem

2021/05/01 11:49 編集

全てを一行に収めることが可能なんですか…びっくりしました。 ちょっと見た感じだと理解できないので、コピーして今から理解するように努めます!ありがとうございます。 確認しました!なるほどです。確かにmaxと合計が同じでなければならないから、それを条件に書けばこうなりますね!すごい、の一言です。 またよろしくお願いします。
guest

0

もう少しスマートな回答がありそうですが、とりあえず回答します。

python

1A = [1] 2B = [4] 3C = [6] 4 5D = [2, 3] 6E = [5] 7F = [7, 8, 9] 8lst = [[2, 4, 6], [3, 4, 6], [1, 5, 6], [1, 4, 7], [1, 4, 8], [1, 4, 9]] 9 10d = { 11 0: D, 12 1: E, 13 2: F, 14} 15original = A + B + C 16 17result = [] 18for k, v in d.items(): 19 for num in v: 20 copy_list = original.copy() 21 copy_list[k] = num 22 result.append(copy_list) 23 24assert lst == result

投稿2021/04/30 12:52

yamap55

総合スコア1376

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

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

hirochem

2021/05/01 11:17

A,B,Cの方からfor文というよりはD,E,Fから攻めていくのか!と驚きました。上手くいきました。こんなにもすぐに回答していただいてありがとうございます。 今後ともよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問