Python-随机排列Python函数的顺序

Python-随机排列Python函数的顺序,python,function,Python,Function,我正在编写一个代码,其中有许多函数,这些函数是稍后在屏幕上显示它们的步骤。是否有方法将哪一组先开始,然后将所有连续步骤分别随机化?要给您提供更多的上下文,请执行以下操作: 我们有两个组(A和B),每个组由几个函数组成(想象它们是一个游戏的步骤)。如您所见,我们从A组的步骤1开始,然后进入B组的步骤1,依此类推: for i in range(x): functionA1(): functionB1(): functionA2(): functionB2()

我正在编写一个代码,其中有许多函数,这些函数是稍后在屏幕上显示它们的步骤。是否有方法将哪一组先开始,然后将所有连续步骤分别随机化?要给您提供更多的上下文,请执行以下操作:

我们有两个组(A和B),每个组由几个函数组成(想象它们是一个游戏的步骤)。如您所见,我们从A组的步骤1开始,然后进入B组的步骤1,依此类推:

for i in range(x):
     functionA1():
     functionB1():
     functionA2():
     functionB2():
....
因此,游戏开始时,步骤在A组和B组之间交替进行。 有没有办法让a组或B组随机开始,然后连续的步骤也在改变?这是一个选项(上面的一个),另一个选项是随机选择的:

for i in range(x):
     functionB1():
     functionA1():
     functionB2():
     functionA2():
....
由于函数列表非常广泛,我真的希望避免在代码中只写下两个可能的选项


谢谢你的帮助

一个选项类似于:

def functionA1():
    print('A1')
def functionA2():
    print('A2')
def functionA3():
    print('A3')
def functionB1():
    print('B1')
def functionB2():
    print('B2')
def functionB3():
    print('B3')

groupA = (functionA1, functionA2, functionA3)
groupB = (functionB1, functionB2, functionB3)
groups = [groupA, groupB]
import random
random.shuffle(groups)
for function1, function2 in zip(*groups):
    function1()
    function2()
输出

B1
A1
B2
A2
B3
A3
此外,如果有两个以上的小组,最好这样做:

for functions in zip(*groups):
    for my_function in functions:
        my_function()
from random import shuffle

functions = ([functionA1, functionB1], [functionA2, functionB2])
for i in range(x):
     for group in functions:
         shuffle(group)
         for func in group:
             func()

通过这种方式,可以很容易地用大量的组来扩展它,而无需更改代码的这一部分。

要保持级别顺序,可以分别对它们进行洗牌

您可以将函数视为一等公民

随机导入
lst=[“a1”、“b1”]、[“a2”、“b2”]]
对于lst中的el:
随机。随机(el)
印刷品(ch)
示例输出:

[['a1', 'b1'], ['b2', 'a2']]
大概是这样的:

for functions in zip(*groups):
    for my_function in functions:
        my_function()
from random import shuffle

functions = ([functionA1, functionB1], [functionA2, functionB2])
for i in range(x):
     for group in functions:
         shuffle(group)
         for func in group:
             func()

如果您有许多功能,最好以某种方式组织它们。例如,在单独的模块中:

# file group_a.py
def function1():
    print("A1")
如果函数的命名方案如下所示,则可以使用
getattr
查找正确的函数


如果它们具有任意名称,则需要在每个模块中创建一个列表,并按照正确的顺序列出函数。这将类似于buran的回答。

以下内容可以扩展到任意数量的组和函数。将为三组演示

from random import randrange

def rotate(arr, r):
    '  Roates an array '
    return arr[r:] + arr[:r]

# Generate groups of functions
n = 4  # number of functions in a group
groupA = [lambda i = i: f'A{i}' for i in range(1, n+1)]
groupB = [lambda i = i: f'B{i}' for i in range(1, n+1)]
groupC = [lambda i = i: f'C{i}' for i in range(1, n+1)]


# Random starting index (i.e. 0 to n-1)
index = randrange(0, n)

# Create function selections (rotate based upon index)
selection = [rotate(x, index) for x in zip(groupA, groupB, groupC)]
for funcs in selection:
    for f in funcs:
        print(f())
输出

例1:

例2


所以只有起始组是随机的,然后根据这个顺序是交替的?假设你有3个组A,B,C和一个随机开始于B,那么序列应该是B1,C1,A1,B2,C2?没错,这正是我所期望的!这似乎没有在各组之间交替进行步骤。的确,它会洗牌分组,但它会先对A组执行所有步骤,然后对B组执行所有步骤。对groupA来说应该是一步,然后是groupB,然后是groupA,依此类推……这是不对的。我添加了示例函数和示例输出。有一个
zip(*groups)
,它将合并第一个组的一个函数和第二个组的一个函数(在组被洗牌后)。谢谢!是的,我明白,但这对我来说是不正确的。预期的输出应该是
[['a1','b1'],['a2','b2']]
['b1','a1'],['b2','a2']]
,因此这些步骤分别交替进行
x
没有定义(也不清楚循环的目的是什么),而且每个组都将被单独洗牌,这与OP要求不一致。我不知道为什么@labgeek会选择接受这个答案,事实上你是完全正确的。只是没注意到而已。但我只是运行了完整的代码,我开始注意到代码中有错误。谢谢你的注意,我还是一个初学者,所以我不能发现错误。谢谢
B1
C1
A1
B2
C2
A2
B3
C3
A3
B4
C4
A4
A1
B1
C1
A2
B2
C2
A3
B3
C3
A4
B4
C4