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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

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

Q&A

解決済

2回答

703閲覧

Pythonで、与えられた文字から順列を用いて単語を生成したい

hamident0

総合スコア6

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

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

0グッド

1クリップ

投稿2020/04/10 05:53

編集2020/04/10 06:56

前提・実現したいこと

Python3.7で、与えれた文字から、順列によって5万個の単語を生成したいです。
また、できた単語の制限 (母音を含まない単語は取り除く) も行いたいです。

現在以下のようなforループを用いた処理を行っているのですが、とてもメモリを食うようです。
より効率よく処理を行うためになにか方法があるでしょうか?

Python

1import random 2# この中から取ってくる用の文字記号リスト 3consonant_inventory = ['p', 'b', 't', 'd', 'c', 'k', 'g', 'q', 'm', 'n', 'r', 'f', 'v', 's', 'z', 'x', 'h', 'l', 'j', 'w', 'ŋ', 'θ', 'ʃ', 'ʒ', 'ð', 'χ', 'ɟ', 'ɢ', 'ʔ', 'ɸ', 'ɴ',""] 4vowel_inventory = ['a', 'i', 'u', 'e', 'o', 'ɛ', 'ɔ', 'ʊ', 'ɪ', 'æ', 'ɑ', 'ʌ', 'ɘ', 'ə', 'ø', 'ɨ', 'ʉ', 'ʊ',""] 5word_inventory = [] 6 7for C1line in consonant_inventory: 8 C1 = C1line 9 for V1line in vowel_inventory: 10 V1 =V1line 11 for C2line in consonant_inventory: 12 C2 = C2line 13 for C3line in consonant_inventory: 14 C3 = C3line 15 for V2line in vowel_inventory: 16 V2 = V2line 17 for C4line in consonant_inventory: 18 C4 = C4line 19 # V1が空の場合はその単語を辞書にいれない、V2が空の場合はC1V1C2だけを辞書にいれる 20 if V1 != "": 21 if V2 == "": 22 word_inventory.append(C1 + V1 + C2) 23 else: 24 word_inventory.append(C1 + V1 + C2 + C3 + V2 + C4) 25 26word_inventory = list(set(word_inventory)) # 重複を取り除く 27word_inventory = random.sample(word_inventory,50000) # 語数を50000語に制限

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

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

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

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

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

guest

回答2

0

ベストアンサー

ランダムに4つと2つとってきて組み合わせる方法です。運がよいと5万回、運が悪いともっとかかりますが、元の試行回数が3億回なのでそれよりマシかと。
重複はsetで除かれます。V1,V2が空の場合は、vowel_inventoryの要素に""が混じってるときだけなので、それがあり得る場合はあらかじめvowel_inventoryから取り除いてwhileに進むと良いかと思います。

python3

1import random 2consonant_inventory = ['p', 'b', 't', 'd', 'c', 'k', 'g', 'q', 'm', 'n', 'r', 'f', 'v', 's', 'z', 'x', 'h', 'l', 'j', 'w', 'ŋ', 'θ', 'ʃ', 'ʒ', 'ð', 'χ', 'ɟ', 'ɢ', 'ʔ', 'ɸ', 'ɴ'] 3vowel_inventory = ['a', 'i', 'u', 'e', 'o', 'ɛ', 'ɔ', 'ʊ', 'ɪ', 'æ', 'ɑ', 'ʌ', 'ɘ', 'ə', 'ø', 'ɨ', 'ʉ', 'ʊ'] 4word_inventory = set() 5while len(word_inventory)<50000: 6 cs = random.choices(consonant_inventory, k=4) 7 vs = random.choices(vowel_inventory, k=2) 8 word_inventory.add(cs[0]+vs[0]+cs[1]+cs[2]+vs[1]+cs[3])

投稿2020/04/10 06:54

jeanbiego

総合スコア3966

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

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

0

Python

1for C1line in consonant_inventory: 2 for V1line in vowel_inventory: 3 if V1line == "": continue 4 for C2line in consonant_inventory: 5 if V2 == "": 6 word_inventory.append(C1line + V1line + C2line ) 7 continue 8 for C3line in consonant_inventory: 9 for V2line in vowel_inventory: 10 for C4line in consonant_inventory: 11 word_inventory.append(C1line + V1line + C2line + C3line + V2line + C4line)

あんまり変わっていませんが、とりあえず貴方のコードを尊重して手直しするならこのような感じでしょうか?
多文少しは処理速度が上がるはず?

投稿2020/04/10 06:18

stdio

総合スコア3307

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問