如何在python上将一组值重新排列成新的模式并打印结果



所以我会尽我所能解释我在寻找什么,现在我有一个100个项目的列表,我想用一个固定的模式来重复洗牌,首先检查这个模式是否最终会把我带回到我开始的地方2将每个循环的结果打印到一个文本文件中。

以3项列表为例(a, b, c)洗牌模式[3 1 2]第三项变成第一项。第一项变成第二项第二项变成了第三项在循环中会生成以下模式

(a, b, c)

(3、1、2)

(c, a, b)

[b, c, a]

(a, b, c)

但是我现在有一个100个项目的列表,我需要找到几个不同模式的每一个安排,我想测试一下。

有谁知道在python中这样做的方法吗?

您可以定义function并多次调用该function,如下所示:

>>> def func(lst, ptr):
...    return [lst[idx-1] for idx in ptr]

>>> lst = ['a','b','c']
>>> ptr = [3,1,2]
>>> for _ in range(5):
...    lst = func(lst, ptr)
...    print(lst)
['c', 'a', 'b']
['b', 'c', 'a']
['a', 'b', 'c']
['c', 'a', 'b']
['b', 'c', 'a']

如果列表包含数字类型,则可以使用numpy高级整数索引:

import numpy as np
original_list=[1,2,3]
numpy_array = np.array(original_list)
pattern = [2,1,0]
print(numpy_array[pattern])
>>> array([3, 2, 1])
def rearrange(pattern : list,L:list):
new_list = []
for i in pattern :
new_list.append(L[i-1])
return new_list
print(rearrange([3,1,2],['a','b','c']))

输出:

['c', 'a', 'b']

Itertools可能就是你需要的。

import itertools
p = itertools.permutations(['a','b','c', 'd'])
list(p)

输出:['a', 'b', 'c', 'd'],('a', 'b', 'd', 'c')('a', 'c', 'b', 'd')('a', 'c', 'd', 'b')('a', 'd', 'b', 'c')('a', 'd', 'c', 'b')('b', 'a', 'c', 'd'),('b', 'a', 'd', 'c'),('b', 'c', 'a', 'd'),('b', 'c', 'd', 'a'),('b', 'd', 'a', 'c'),('b', 'd', 'c', 'a'),('c', 'a', 'b', 'd'),('c', 'a', 'd', 'b'),('c', 'b', 'a', 'd'),('c', 'b', 'd', 'a'),('c', 'd', 'a', 'b'),('c', 'd', 'b', 'a'),('d', 'a', 'b', 'c'),('d', 'a', 'c', 'b'),('d', 'b', 'a', 'c'),('d', 'b', 'c', 'a'),("d","c","a","b"),('d', 'c', 'b', 'a')]