python - 在大目录中查找随机对

标签 python performance io

我有大约 5M csv 文件存储在大约 100.000 个文件夹中。每个文件夹包含大致相同数量的文件,并且文件夹中的文件数量始终为偶数。对于统计建模项目,我需要找到所有这些文件的路径并将它们以有点奇怪的顺序加载到列表中。

特别是,我需要坚持以下几点:

  • 唯一性:每个文件只能在列表中出现一次
  • 成对:每个文件必须与同一文件夹中的另一个文件相邻(如果由于随机性,它可以与两个相邻)
  • 随机性:任何两个未“配对”的文件彼此相邻的概率应该相同(即,仅迭代所有文件是行不通的)

我在下面创建了一个示例。

文件

Folder_1
- File_A
- File_B
- File_C
- File_D
Folder_2
- File_E
- File_F
- File_G
- File_H

良好结果(随机,但坚持成对规则)

paths = ['Folder_1/File_A', 'Folder_1/File_D', 'Folder_2/File_G',  'Folder_2/File_F',  'Folder_2/File_E', 'Folder_2/File_H', 'Folder_1/File_C', 'Folder_1/File_B']

一个简单的方法可能类似于“选择一个随机文件夹,在该文件夹中选择一个随机文件,并在该文件夹中随机选择一对。将这些选择保存在列表中以避免再次被选择。重复。”。但是,这将花费太长时间。您能推荐一个创建此列表的好策略吗?如果需要,可以稍微放宽随机性要求。

最佳答案

确保一切都是随机的一种方法是使用 random.shuffle,它会就地打乱列表。这样你就可以简单地将每个项目与它的邻居配对,因为配对是随机的。为了获得像您的示例这样的结果,您可以洗牌并展平结果对列表。这是一个例子:

from random import shuffle

# generate some sample directory names
ls = [[]] * 5
i = 0
while i < len(ls):
    ls[i] = [str(i) + chr(j) for j in range(97,101)]
    i += 1

# shuffle files within each directory
pairs = []
for l in ls:
    shuffle(l)
    pairs += list(zip(l[1::2], l[::2]))

# shuffle and flatten the list of pairs
shuffle(pairs)
flat = [item for sublist in pairs for item in sublist]    
print(flat)

关于python - 在大目录中查找随机对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39110012/

相关文章:

python - 将字节字符串转义为字节串

python - 有没有办法从 Python 的日期时间获取 Django 的默认日期和时间字符串?

java - scala.io.Source 找不到现有文件

java - 处理一个巨大的文件并在文件的每一行快速调用一个函数

python - 模块 'six.moves' 没有属性 'collections_abc'

python - 动画条形图

performance - “MapList”函数

c# - Generic List Contains() 性能和替代方案

html - insertAdjacentHTML 为何比 innerHTML 快这么多?

java - Java中的基本输入和输出