Итерировать случайным образом по нескольким спискам последовательно - PullRequest
0 голосов
/ 14 января 2019

Предположим, у меня есть три класса объектов и три списка, содержащие несколько экземпляров соответствующего класса. Я хочу, чтобы каждый объект выполнял подобное действие n раз. Я могу сделать это в фиксированном порядке с помощью itertools.chain (выполнить итерацию по каждому объекту в первом списке n раз, сделать это для второго списка и т. Д.).

Моя проблема в том, что я должен сделать это случайно. Это означает: выбрать один объект случайным образом из одного из трех списков, выбранных случайным образом, выполнить индивидуальное действие и делать это до тех пор, пока все действия не будут выполнены.

Пока что возможные решения, которые я представляю, очень громоздки, может быть, вы сможете показать мне питонский способ сделать это ...

Спасибо!

Вот упрощенная версия решения itertools.chain:

import itertools as iter
n_objects = 10
n_actions_A = 10
n_actions_B = 2
n_actions_C = 30

Class A(object):

    def __init__(self):
        self.counter = 0
    def action(self):
        for i in range(n_actions_A):
            self.counter += 1

Class B(object):
    def __init__(self):
        self.counter = 0
    def action(self):
        for i in range(n_actions_B):
            self.counter += 1

Class C(object):
    def __init__(self):
        self.counter = 0
    def action(self):
        for i in range(n_actions_C):
            self.counter += 1

A_list = [A() for n in range(n_objects)]
B_list = [B() for n in range(n_objects)]
C_list = [C() for n in range(n_objects)]

for myobject in iter.chain(A_list, B_list, C_list):
    myobject.action()

print [myobject.counter for myobject in A_list]

Редактировать: количество действий отличается от класса к классу. Я предполагаю, что мне нужно создать список подсписков, каждый из которых представляет отдельное действие и со ссылкой на соответствующий объект. После действия список будет удален. Подсписок будет выбран с помощью random.choice, поэтому каждое действие имеет одинаковую вероятность ...

1 Ответ

0 голосов
/ 14 января 2019

Я думаю, что вы ищете что-то вроде random.sample или random.shuffle.

Вот способ

выберите один объект случайным образом из одного из трех списков, выбранных случайным образом, выполните индивидуальное действие и делайте это до тех пор, пока все действия не будут выполнены

from random import shuffle

a = ['X','Y','Z','W']
b = ['A','B','C','D']
c = [1,2,3,4,5]

a_list = [a,b,c]
shuffle(a_list)

for _, rnd_list in enumerate(a_list):
    print(f'processing list: {rnd_list}')
    shuffle(rnd_list)
    for rnd_item in rnd_list:
        print(rnd_item)

Выход:

processing list: [1, 2, 3, 4, 5]
3
5
4
1
2
processing list: ['A', 'B', 'C', 'D']
A
C
D
B
processing list: ['X', 'Y', 'Z', 'W']
W
Y
Z
X
...