Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用字符串开头python上的约束对列表中的字符串进行随机化_Python_String_List_Random_Choice - Fatal编程技术网

使用字符串开头python上的约束对列表中的字符串进行随机化

使用字符串开头python上的约束对列表中的字符串进行随机化,python,string,list,random,choice,Python,String,List,Random,Choice,我有一个文件名列表RIR\u list,格式为number/filename。例如3/foo。在这种情况下,数字是1-30之间的整数(不丧失一般性) 我希望从上一个列表中选择n对的子列表。对于这两个条目,n对中的每一对在开头都应该有相同的编号。有效代码为(如果我没有遗漏任何内容): 如果我只想随机化n个条目,我可以用一行的random.choices(RIR\u list,k=n)对两个条目进行随机选择。有没有一种方法可以更优雅地做傻事?更重要的是,也许计算量更低 附言。 不允许使用具有相同文件

我有一个文件名列表
RIR\u list
,格式为
number/filename
。例如
3/foo
。在这种情况下,数字是1-30之间的整数(不丧失一般性)

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

如果我只想随机化n个条目,我可以用一行的
random.choices(RIR\u list,k=n)
对两个条目进行随机选择。有没有一种方法可以更优雅地做傻事?更重要的是,也许计算量更低

附言。
不允许使用具有相同文件名的对,每个数字恰好包含相同数量的文件,但如果不同,则首选该数字的均匀分布,即如果它包含两个文件,则每个数字的概率为0.5

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

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

如果您有1个文件用于
1
和100个文件用于
2
组合,那么
1
的一个文件是否具有与
2
组合的100个文件相同的概率?另外,是否应该允许同一个文件的两倍“配对”呢?我已经编辑了这篇文章来回答你的评论。在我的实现中,是否存在
random.choices()。我能在没有限制的情况下从这本词典中挑选词条吗?我的意思是只选取n个值,而不考虑它们的开始,甚至不成对?
n = random.choice(files).split("/")[0]
pair = random.sample(grouped[n], 2)
# ['00/866', '00/592']