从列表开始对字符串进行随机化,并限制以字符串开头的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)使用一次单行import serial import struct ser = serial.Serial( port = '/dev/ttyUSB0',baudrate = 19200,parity = serial.PARITY_NONE,stopbits = serial.STOPBITS_ONE,bytesize = serial.EIGHTBITS ) print(ser.isOpen()) thestring = "7E FF 02 03 04 05 7F" data = struct.pack(hex(thestring)) ser.write(data) s = ser.read(1) print(s) ser.closed() 。有没有办法以更优雅的方式来做傻瓜工作?更重要的是,也许计算量较低?

P.S。 不允许使用具有相同文件名的配对,并且每个数字碰巧都包含相同数量的文件,但是如果不同,则首选相对于该数字的均匀分布,即,如果包含两个文件,则概率为每个0.5。

yezhao07 回答:从列表开始对字符串进行随机化,并限制以字符串开头的python

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

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

但是,这意味着每个编号都有相同的概率,无论以该编号开头的文件有多少个。如果希望概率反映文件数,则可以随机选择一个文件,获取前缀,然后从相应组中获取文件对。

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

(此处将random.sample用于具有不同部分的对;如果要允许成对的相同元素,请使用random.choices。)

本文链接:https://www.f2er.com/3057044.html

大家都在问