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

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

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

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

Python

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

Q&A

解決済

3回答

1643閲覧

pythonでリスト内のリストでの組み合わせ

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2017/10/05 03:50

python初学者です

リスト内での組み合わせを求めたいのですが例えば、

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

このようなリストがあるとき、二番目のリストは無視して一番目と三番目のリストから3つずつ数字を取り出して組み合わせを求めたいのですがどのような方法があるでしょうか?

またリスト内で取り出す数字を制限することはできるでしょうか?
例えば1番目のリストから数字を取り出すとき隣り合った数字からしか取り出せないようにしたい時、どのような方法が考えられますか


[3, 4, 1], [4, 1, 5],[1, 5, 6]...

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

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

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

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

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

guest

回答3

0

3つの異なる要素の組み合わせをすべて作るには、3重のforループを使います。

lang

1l0 = range(5) # [0, 1, 2, 3, 4] 2len0 = len(l0) 3 4for i in range(len0): 5 for j in range(i + 1, len0): 6 for k in range(j + 1, len0): 7 print(l0[i],l0[j],l0[k]) 8# 0 1 2 9# 0 1 3 10# 0 1 4 11# ... 12# 2 3 4

2つのリストからそれぞれ3つ取り出すとなると6重ループになり少々見苦しいので、generator functionを定義するとすっきりします。

lang

1ls = [['3', '4', '1', '5', '6', '2'], ['0', '1', '7', '5', '2', '1'], ['5', '1', '3', '0', '8', '4']] 2 3def triples(lst): 4 n = len(lst) 5 for i in range(n): 6 for j in range(i + 1, n): 7 for k in range(j + 1, n): 8 yield (lst[i], lst[j], lst[k]) 9 10for x, y, z in triples(ls[0]): 11 for a, b, c in triples(ls[2]): 12 print(f'({x},{y},{z}),({a},{b},{c})') 13# (3,4,1),(5,1,3) 14# (3,4,1),(5,1,0) 15# ... 16# (5,6,2),(0,8,4)

itertoolsライブラリのcombinations関数を使っても同じことができます。

lang

1from itertools import combinations 2 3ls = [['3', '4', '1', '5', '6', '2'], ['0', '1', '7', '5', '2', '1'], ['5', '1', '3', '0', '8', '4']] 4 5for x, y, z in combinations(ls[0], 3): 6 for a, b, c in combinations(ls[2], 3): 7 print(f'({x},{y},{z}),({a},{b},{c})') 8# (3,4,1),(5,1,3) 9# (3,4,1),(5,1,0) 10# ... 11# (5,6,2),(0,8,4)

例えば1番目のリストから数字を取り出すとき隣り合った数字からしか取り出せないようにしたい時、どのような方法が考えられますか

他の回答者さんがすでにお答えになっているので省略します。

投稿2017/10/05 04:29

編集2017/10/05 04:36
karamarimo

総合スコア2553

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

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

0

ベストアンサー

このようにできると思います。

python

1>>> a = [['3', '4', '1', '5', '6', '2'], ['0', '1', '7', '5', '2', '1'], ['5', '1', '3', '0', '8', '4']] 2>>> print([[a[0][i:i+3],a[2][i:i+3]] for i in range(4)]) 3[[['3', '4', '1'], ['5', '1', '3']], [['4', '1', '5'], ['1', '3', '0']], [['1', '5', '6'], ['3', '0', '8']], [['5', '6', '2'], ['0', '8', '4']]]

説明すると思います。
まずはpythonのリスト内包表記という機能って分かりますか?
上のコードと下のコードは同じです。

python

1b = [] 2for i in range(4): 3 b.append([a[0][i:i+3],a[2][i:i+3]]) 4print(b)

リスト内包表記で一行だけで上のコードができますよ。

投稿2017/10/05 04:32

golgi

総合スコア31

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

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

0

隣接するものだけでいいのならば数学的な意味でのコンビネーションではないですよね?

ならばこうでしょうか?

python

1lists = [['3', '4', '1', '5', '6', '2'], 2 ['0', '1', '7', '5', '2', '1'], 3 ['5', '1', '3', '0', '8', '4']] 4 5results = [] 6 7for i in (0,2): 8 for j in range(len(lists[i])-2): 9 results.append([lists[i][j],lists[i][j+1],lists[i][j+2]]) 10 11print(results)

結果

[['3', '4', '1'], ['4', '1', '5'], ['1', '5', '6'], ['5', '6', '2'], ['5', '1', '3'], ['1', '3', '0'], ['3', '0', '8'], ['0', '8', '4']]

もう少し短くできるかもしれませんけど。。(^ ^;

追記:

6つの数字をどう出力するか(2次元リスト?一つのリスト?)も書いてほしかったです。。(^ ^;

コンビネーションはitertoolsで作れます。

python

1from itertools import combinations 2 3lists = [['3', '4', '1', '5', '6', '2'], 4 ['0', '1', '7', '5', '2', '1'], 5 ['5', '1', '3', '0', '8', '4']] 6 7for c0 in combinations(lists[0],3): 8 for c2 in combinations(lists[2],3): 9 print(list(c0+c2))

結果は長いので省略します。

隣接のほうですけど、lists[0]の数字とlists[2]の数字はもちろん隣接していませんよね?
それを同時に出力して意味があるのでしょうか..?

python

1lists = [['3', '4', '1', '5', '6', '2'], 2 ['0', '1', '7', '5', '2', '1'], 3 ['5', '1', '3', '0', '8', '4']] 4 5adjoin_results = [] 6 7for j in range(len(lists[0])-2): 8 adjoin_results.append([lists[0][j],lists[0][j+1],lists[0][j+2], 9 lists[2][j],lists[2][j+1],lists[2][j+2]]) 10 11print(adjoin_results)

結果

[['3', '4', '1', '5', '1', '3'], ['4', '1', '5', '1', '3', '0'], ['1', '5', '6', '3', '0', '8'], ['5', '6', '2', '0', '8', '4']]

投稿2017/10/05 04:04

編集2017/10/05 04:37
namnium1125

総合スコア2043

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

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

退会済みユーザー

退会済みユーザー

2017/10/05 04:12

1番目と3番目のリストから3つづつ、つまり合わせると6つの数字で結果を出したいです 質問がわかりにくくてすみません・・・ また、隣接するものだけの時とそれ以外の場合とでそれぞれ回答をいただけるとありがたいです 質問がわかりにくくて申し訳ないです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問