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

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

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

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

Q&A

解決済

5回答

1699閲覧

pythonでの組み合わせをするコードについて

ilovearchlinux

総合スコア15

Python

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

0グッド

0クリップ

投稿2018/09/15 11:12

編集2018/09/15 11:13

プログラミング勉強中なんですが、下記のようなこと実装できるコードを書きたいのですが
未熟で考えが及ばないので質問させてもらいます
サンプルのコードやサイトを教えていただきたいです

EX)ABCとabcと123の文字列の組み合わせ(を重複のない結果すべてを出力)
ABCabc,ABCabc123,ABC123abc,abcABC,abcABC123,abc1123ABC...(略)

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

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

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

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

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

guest

回答5

0

ベストアンサー

Pythonなど不要。そう、シェル芸ならね!

bash

1$ echo {0..3}{1..3}{1..3}|tr ' ' '\n'|tr -d 0|grep -v '(.).*\1'|sed 's/1/ABC/;s/2/abc/;s/3/123/' 2ABCabc 3ABC123 4abcABC 5abc123 6123ABC 7123abc 8ABCabc123 9ABC123abc 10abcABC123 11abc123ABC 12123ABCabc 13123abcABC

投稿2018/09/16 01:48

hichon

総合スコア5737

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

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

0

itertoolsというパッケージを使うと簡単ですが、何も知らずとも↓これくらいは考えつかないとおかしいです。

Python

1data = ["ABC","abc","123"] 2 3for a in data: 4 for b in data: 5 for c in data: 6 if a != b and a != c and b != c: 7 print(a+b+c)

なお、これは算数・数学用語では組み合わせじゃなくて順列と言います。

重複チェックは、3つくらいなら上記でも良いけど、数が多くなると書くのが大変なので、
if len(set([a,b,c])) == 3:
みたいに、setにして個数を数える。

投稿2018/09/15 11:36

otn

総合スコア84489

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

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

0

べき集合 を作りたいのであれば、公式リファレンスにサンプルコードがありますよ。

python

1from itertools import chain, combinations 2 3data = ['ABC', 'abc', '123'] 4 5def powerset(s): 6 result = chain.from_iterable( 7 combinations(s, r) for r in range(len(s) + 1)) 8 return list(result) 9 10pset = powerset(data) 11 12print(pset) 13# [(), ('ABC',), ('abc',), ('123',), ('ABC', 'abc'), ('ABC', '123'), ('abc', '123'), ('ABC', 'abc', '123')] 14 15for i, elem in enumerate(pset): 16 string = ''.join(elem) 17 print('{}: "{}"'.format(i, string)) 18# 0: "" 19# 1: "ABC" 20# 2: "abc" 21# 3: "123" 22# 4: "ABCabc" 23# 5: "ABC123" 24# 6: "abc123" 25# 7: "ABCabc123"

投稿2018/09/15 11:30

tiitoi

総合スコア21956

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

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

0

候補をリストに放り込み、
それから itertools.permutations で重複なし順列を取得します。

そして得られた各リストを str.join でくっつけてやれば良いです。

追記

コードを書いている人がいるので、便乗。

Python

1from itertools import chain, permutations 2 3 4src = ['ABC', 'abc', '123'] 5it = chain.from_iterable( 6 permutations(src, l) for l in range(len(src)+1)[2:] 7) 8 9print(*map(''.join, it), sep='\n')

実行結果 Wandbox

plain

1ABCabc 2ABC123 3abcABC 4abc123 5123ABC 6123abc 7ABCabc123 8ABC123abc 9abcABC123 10abc123ABC 11123ABCabc 12123abcABC

投稿2018/09/15 11:18

編集2018/09/15 12:10
LouiS0616

総合スコア35660

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

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

0

順列ではなくべき集合というのでしょうか?勉強になります。

こんな書き方でも出来ました。

Python

1# coding=UTF-8 2import itertools 3 4s = ["ABC","abc","123"] 5for i in range(len(s)): 6 it = itertools.combinations(s,i+2) 7 for j in it: 8 for k in itertools.permutations(j): 9 str = "" 10 for l in k: 11 str += l 12 print(str)

-こういうことでしたか-

ABCabc ABCabc123 abcABC ABC123abc ABC123 abcABC123 123ABC abc123ABC abc123 123ABCabc 123abc 123abcABC

投稿2018/09/15 11:28

編集2018/09/16 03:09
opyon

総合スコア1009

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問