从列表中随机化字符串,并限制字符串开头 python
Randomize strings from a list with constraints on string beginning python
我有一个 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)
两次成对。有没有办法以更优雅的方式完成傻瓜工作?更重要的是,也许计算量更低?
P.S。
不允许具有相同文件名的对,并且每个数字恰好包含相同数量的文件,但如果不同,则首选关于该数字的均匀分布,也就是说,如果它包含两个文件,则概率为每个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
。)
我有一个 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)
两次成对。有没有办法以更优雅的方式完成傻瓜工作?更重要的是,也许计算量更低?
P.S。 不允许具有相同文件名的对,并且每个数字恰好包含相同数量的文件,但如果不同,则首选关于该数字的均匀分布,也就是说,如果它包含两个文件,则概率为每个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
。)