2017-09-06 10 views
0

以下の2つの機能を1つの非常に短いものに組み合わせたいと思います。ユニークなリスト生成での再帰的ロジックの短縮

random_strsが指定されているものletters容器から引き上げ、n一意の文字列のリスト、長lengthのそれぞれを生成します。 nonunique_random_strsは、内部で呼び出されたヘルパーです。論理は、ユニークな要素の数をnに対してチェックし、次に要素を追加し、2つが等しくなるまでこのプロセスを繰り返すことです。

import numpy as np 

def nonunique_random_strs(length, n, letters): 
    strs = np.random.choice(letters, size=(n, length)).tolist() 
    strs = [''.join(inner) for inner in strs] 
    return strs 

def random_strs(length, n, letters): 
    strs = list(set(nonunique_random_strs(length, n, letters))) 
    to_add = n - len(strs) 
    while to_add > 0: 
     added = nonunique_random_strs(length=length, n=to_add, letters=letters) 
     strs.extend(added) 
     strs = list(set(strs)) 
     to_add = n - len(strs) 
    return strs 

print(random_strs(length=2, n=5, letters=list('abcde'))) 
# ['cb', 'ce', 'dc', 'db', 'ba'] 

だから、機能的だが、私は自分自身の中にrandom_strsを参照したいのですが、トラブルのことをビルドが生じています。

+0

機能がネストされている可能性がありますか? –

+1

あなたの目標はここでは「再帰について学んでください」ですか?もしそうでなければ、上記を 'print(random.sample(list)itertools.combinations( 'abcde'、2))、5))'に置き換えることで同じ結果を得ることができると思います。 – larsks

+0

@BradSolomon文字列のリスト 'random.sample([a + b、itertools.combinations( 'abcde'、2)内のa、b]、5)' – salparadise

答えて

0

これは、多くのitertoolsで簡単かつ標準randomではなくnp.randomを使用してなった:

from itertools import combinations_with_replacement 
import random 
import string 

def random_strs(length, n): 
    letters = string.ascii_uppercase 
    res = random.sample(list(combinations_with_replacement(letters, 
                  length)), n) 
    res = [''.join(i) for i in res] 
    return res 

print(random_strs(3, 5)) 
['GWX', 'KVW', 'DFX', 'FFM', 'QUY'] 

あなたが& @salparadiseを@larsksありがとうございました。

関連する問題