【问题标题】:Shortening recursive logic in unique list generation缩短唯一列表生成中的递归逻辑
【发布时间】:2017-09-07 04:27:59
【问题描述】:

我想把下面的两个函数合并成一个更短的函数。

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 并且在构建它时遇到了麻烦。

【问题讨论】:

  • 也许嵌套函数?
  • 你的目标是“学习递归”吗?因为如果不是,我认为您可以通过将上面的内容替换为 print(random.sample(list(itertools.combinations('abcde', 2)), 5)) 来获得相同的结果。
  • @BradSolomon 字符串列表random.sample([a + b for a,b in itertools.combinations('abcde', 2)], 5)

标签: python python-3.x recursion


【解决方案1】:

使用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。

【讨论】:

    猜你喜欢
    • 2012-04-09
    • 2016-05-14
    • 2021-01-30
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2016-07-26
    • 2012-12-12
    相关资源
    最近更新 更多