如何将一组值重新排列为 python 上的新模式并打印结果
How can I rearrange a set of values into new pattern on python and print results
所以我会尽力解释我在找什么,
目前我有一个 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 中执行此操作的方法。
如果您的列表包含数字类型,您可以使用 numpy advanced integer indexing:
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']
您可以定义 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']
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')]
所以我会尽力解释我在找什么, 目前我有一个 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 中执行此操作的方法。
如果您的列表包含数字类型,您可以使用 numpy advanced integer indexing:
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']
您可以定义 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']
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')]