python - 从列表中随机化字符串,并对字符串的开头进行约束

标签 python random

我有一个RIR_list格式的文件名列表number/filename。例如3/foo。在本例中,数字是 1 到 30 之间的整数(不失一般性)。

我希望从前一个列表中选择一个包含 n 对的子列表。 n 对中的每一对在两个条目的开头都应具有相同的编号。有效的代码是(如果我没有遗漏任何内容):

#choose a random beginning for each pair    
room_nb = np.random.randint(30,size=n)+1
#iterate through pairs
for i in range(n): 
    #generate sublist containing only entries with the correct beginning for this iteration
    room_RIR = [rir for rir in RIR_list if rir.startswith(str(room_nb[i])+'/')] 
    #pick a random pair with the same header for this iteration
    chosen_RIR = random.choices(room_RIR, k=2)

如果我只想随机化 n 个条目,我可以使用单行 random.choices(RIR_list, k=n) 两次来进行配对。有没有一种方法可以以更优雅的方式完成愚蠢的工作?更重要的是,也许计算量更低?

附注
不允许具有相同文件名的对,因此每个数字恰好包含相同数量的文件,但如果不同,则优先考虑该数字的均匀分布,也就是说,如果它包含两个文件,则概率为每个 0.5。

最佳答案

您可以按前缀对文件进行一次分组并将其存储在字典中,而不是每次创建文件对时都查找具有相同前缀的文件。这样,您可以从该字典中随机选择一个条目,然后从该组中选择一个样本。

import random
files = ["%02d/%03d" % (random.randint(0, 10), random.randint(100,999))
         for _ in range(100)]

grouped = {}
for f in files:
    grouped.setdefault(f.split("/")[0], []).append(f)
groups = list(grouped.values())

pairs = [random.sample(random.choice(groups), 2) for _ in range(3)]
# [['00/982', '00/123'],
#  ['04/644', '04/649'],
#  ['01/164', '01/316']]

但这意味着,无论有多少个文件以该数字开头,每个数字都将具有相同的概率。如果您希望概率反射(reflect)文件的数量,您可以随机选择一个文件,获取前缀,然后从各自的组中获取文件对。

n = random.choice(files).split("/")[0]
pair = random.sample(grouped[n], 2)
# ['00/866', '00/592']

(此处使用 random.sample 来表示不同部分的对;如果您想允许相同元素对,请使用 random.choices。)

关于python - 从列表中随机化字符串,并对字符串的开头进行约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58977914/

相关文章:

sql-server - 如何选择 X 随机行,同时保证 Y 某些特定行出现在结果中?

java - 如何使用此分布在 Java 中生成随机 boolean 值?

python - flask 形式不起作用

python - cx_Freeze 和 Python 的各种 build_exe_options 是什么?

python - 使用 Python 语音识别时的说话人分类

python - 如何在我的主模式 Hook 中访问目录局部变量?

python : Any use of this assignment to an empty list?

random - 生成随机 ASCII 字符

c# - (U)Int64 和 Decimal 的(伪)随机约束值的生成

algorithm - 从随机位生成随机数