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

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

ただいまの
回答率

90.52%

  • Python

    7947questions

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

  • Python 3.x

    6359questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 1,245
退会済みユーザー

退会済みユーザー

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]...

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

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

l0 = range(5)   # [0, 1, 2, 3, 4]
len0 = len(l0)

for i in range(len0):
    for j in range(i + 1, len0):
        for k in range(j + 1, len0):
            print(l0[i],l0[j],l0[k])
# 0 1 2
# 0 1 3
# 0 1 4
# ...
# 2 3 4

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

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

def triples(lst):
    n = len(lst)
    for i in range(n):
        for j in range(i + 1, n):
            for k in range(j + 1, n):
                yield (lst[i], lst[j], lst[k])

for x, y, z in triples(ls[0]):
    for a, b, c in triples(ls[2]):
        print(f'({x},{y},{z}),({a},{b},{c})')
# (3,4,1),(5,1,3)
# (3,4,1),(5,1,0)
# ...
# (5,6,2),(0,8,4)

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

from itertools import combinations

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

for x, y, z in combinations(ls[0], 3):
    for a, b, c in combinations(ls[2], 3):
        print(f'({x},{y},{z}),({a},{b},{c})')
# (3,4,1),(5,1,3)
# (3,4,1),(5,1,0)
# ...
# (5,6,2),(0,8,4)

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

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

>>> a = [['3', '4', '1', '5', '6', '2'], ['0', '1', '7', '5', '2', '1'], ['5', '1', '3', '0', '8', '4']]
>>> print([[a[0][i:i+3],a[2][i:i+3]] for i in range(4)])
[[['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のリスト内包表記という機能って分かりますか?
上のコードと下のコードは同じです。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

ならばこうでしょうか?

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

results = []

for i in (0,2):
    for j in range(len(lists[i])-2):
        results.append([lists[i][j],lists[i][j+1],lists[i][j+2]])

print(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で作れます。

from itertools import combinations

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

for c0 in combinations(lists[0],3):
    for c2 in combinations(lists[2],3):
        print(list(c0+c2))


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

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

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

adjoin_results = []

for j in range(len(lists[0])-2):
    adjoin_results.append([lists[0][j],lists[0][j+1],lists[0][j+2],
                           lists[2][j],lists[2][j+1],lists[2][j+2]])

print(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 13:12

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

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7947questions

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

  • Python 3.x

    6359questions

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