依次迭代多个列表

时间:2019-01-14 15:29:12

标签: python list random iteration

假设我有三个对象类和三个包含相应类的多个实例的列表。我希望每个对象执行类似的操作n次。我可以使用itertools.chain以固定的顺序执行此操作(对第一个列表中的每个对象重复n次,对第二个列表中的对象重复执行,等等)。

我的问题是,我必须随机进行。这意味着:从随机选择的三个列表之一中随机选择一个对象,执行单个操作,然后执行所有操作。

到目前为止,我能想到的可能解决方案非常繁琐,也许您可​​以向我展示实现此目标的Python方法...

谢谢!

这是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 :(得分:0)

我认为您正在寻找类似random.samplerandom.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