Python リスト内の文字型組み合わせについて
解決したいこと
l = ['A','B','C','D']
l内のリストにあるstr型の文字を全て組み合わせたいと思っています。
itertoolsなどの組み込み関数を使わず、
リストを2つに分ける事もせず、結果として、
'AB','AC','AD','BC','BD','CD'
以上6パターンの組合せ(strで出力)を作りたいのですが、どのようなコードにすれば良いでしょうか?
教えて頂けると幸いです。
0 likes
l = ['A','B','C','D']
l内のリストにあるstr型の文字を全て組み合わせたいと思っています。
itertoolsなどの組み込み関数を使わず、
リストを2つに分ける事もせず、結果として、
'AB','AC','AD','BC','BD','CD'
以上6パターンの組合せ(strで出力)を作りたいのですが、どのようなコードにすれば良いでしょうか?
教えて頂けると幸いです。
itertools.permutations()
のドキュメントに、 itertools を使わなかった場合の実装例が書いてあります。
@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さんの回答を参考にしていただければいいと思います。
@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から増やすことで全ての組み合わせを求めることができます。プログラミンングっぽい邪道な解き方なので分かりにくいと思いますが、このような解くこともできます。
また、乱数を使う解き方もあります。乱数を使うと数学的な知識がなくても、組合わせの概念と組み合わせの合計の個数が分かれば解けます。仮に合計の個数が分からなくても、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)