@th8687rr

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Python リスト内の文字型組み合わせについて

解決したいこと

l = ['A','B','C','D']

l内のリストにあるstr型の文字を全て組み合わせたいと思っています。
itertoolsなどの組み込み関数を使わず、
リストを2つに分ける事もせず、結果として、
'AB','AC','AD','BC','BD','CD'
以上6パターンの組合せ(strで出力)を作りたいのですが、どのようなコードにすれば良いでしょうか?

教えて頂けると幸いです。

0 likes

3Answer

itertools.permutations() のドキュメントに、 itertools を使わなかった場合の実装例が書いてあります。

1Like

Comments

  1. @th8687rr

    Questioner

    早速ありがとうございました!重複と順序を考慮すると、ここまで複雑になるのですね。

単純にその例を満たすだけであれば

result = []
for i in range(len(l)):
  for j in range(i + 1, len(l)):
    result.append(l[i] + l[j])
print(result)

と書けますが、重複や順序その他を考慮するならばuasiさんの回答を参考にしていただければいいと思います。

1Like

Comments

  1. @th8687rr

    Questioner

    ありがとうございました!これで、文字列同士で組合せる事ができました。

質問クローズ後の回答失礼します。
こんな方法でもできます。@_y_sさんのプログラムと似ていますが少し違います。

l = ['A','B','C','D']
result = []
for step in range(1, len(l)):
    for i in range(len(l)-step):
        result.append(l[i] + l[i+step])
print(result)

処理のイメージです。青枠は使うリストの2つの要素です。stepという変数を1から増やすことで全ての組み合わせを求めることができます。プログラミンングっぽい邪道な解き方なので分かりにくいと思いますが、このような解くこともできます。
図1.png

また、乱数を使う解き方もあります。乱数を使うと数学的な知識がなくても、組合わせの概念と組み合わせの合計の個数が分かれば解けます。仮に合計の個数が分からなくても、while文を十分な回数で打ち切ることで解くことができます。ただ、この場合解けているかの判別に数学の知識は必要になりますが。
このように色々な解き方ができます。

import random

l = ['A','B','C','D']
result = []
count = 0
while count < 6:
    koho_l = random.sample(l, 2)  # 適当に重複なしでリストlから2つの要素のリストが入る
    koho_str = koho_l[0] + koho_l[1]  # 文字列にする
    r_koho_str = koho_l[1] + koho_l[0]  # 文字列の逆順にする
    # resultにkoho_strとr_koho_strがないとき、またはresultが空のときに
    # reslutにkoho_strを追加する
    if (koho_str not in result and r_koho_str not in result) or len(result) == 0:
        result.append(koho_str)
        count += 1  # countを1増やす
print(result)
0Like

Your answer might help someone💌