我想将下面的两个函数组合成一个更短的函数。
random_strs
生成一个n
个唯一字符串列表,每个字符串长度为length
,从指定的任何letters
容器中提取。 nonunique_random_strs
只是一个内部的助手。逻辑是检查n
的唯一元素的数量,然后添加元素并重复此过程,直到两者相等。
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 :(得分: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']
谢谢@larsks& @salparadise。