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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア2555
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
総合スコア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総合スコア2045
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。