繁体   English   中英

随机化列表中的字符串,并限制字符串开头 python

[英]Randomize strings from a list with constraints on string beginning python

我有一个格式为number/filename的文件名列表RIR_list 例如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)两次配对。 有没有办法以更优雅的方式完成愚蠢的工作? 更重要的是,也许计算量更低?

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

无需每次创建对时都查找具有相同前缀的文件,您可以按文件的前缀对文件进行一次分组并将它们存储在字典中。 这样,您可以随机 select 来自该字典的条目,然后是来自该组的样本。

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']]

然而,这意味着每个数字都有相同的概率,无论有多少文件以该数字开头。 如果您希望概率反映文件的数量,您可以随机 select 一个文件,获取前缀,然后从相应的组中获取对。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM