Я упомянул этот подход в комментариях, но я не знаю, правильно ли я его объяснил, поэтому я уточню здесь.
Вы можете использовать random.sample
, чтобы получить несколько значений из коллекции без дубликаты.
import random
def iterate_over_files_randomly():
the_filenames = ["a", "b", "c", "d", "e", "f"]
for filename in random.sample(the_filenames, len(the_filenames)):
yield filename
for filename in iterate_over_files_randomly():
print(filename)
Вы также можете перетасовать список и выполнить итерации по нему.
import random
def iterate_over_files_randomly():
the_filenames = ["a", "b", "c", "d", "e", "f"]
random.shuffle(the_filenames)
for filename in the_filenames:
yield filename
for filename in iterate_over_files_randomly():
print(filename)
В любом случае генератор будет go просматривать весь список файлов в каталоге , никогда не повторяясь в будущем, пока список файлов не будет исчерпан. Пример вывода:
b
c
f
e
d
a
Оба подхода имеют O (N) время выполнения. Другими словами, каждое дополнительное полученное значение занимает столько же времени, сколько и предыдущие полученные значения. Это частично объясняется тем фактом, что функция генератора не разбивает список и не манипулирует каким-либо иным образом списком в пределах for
l oop.