缩短唯一列表生成中的递归逻辑

时间:2017-09-06 19:18:40

标签: python python-3.x recursion

我想将下面的两个函数组合成一个更短的函数。

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并且无法构建它。

1 个答案:

答案 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。