通过索引列表置换元组

tom*_*zer 3 python tuples

我有一个3元素的python元组,我正在尝试使用3元素列表的索引进行排序或重新排列,我想知道最简洁的方法是什么.

到目前为止我有:

my_tuple = (10, 20, 30)
new_positions = [2, 0, 1]
my_shuffled_tuple = my_tuple[new_positions[0]], my_tuple[new_positions[1]], my_tuple[new_positions[2]]
# outputs: (30, 10, 20)
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我也得到相同的结果:

my_shuffled_tuple = tuple([my_tuple[i] for i in new_positions])
Run Code Online (Sandbox Code Playgroud)

是否有更简洁的创作方式my_shuffled_tuple

Bas*_*els 5

一种方法是使用生成器表达式作为参数tuple,它接受一个iterable:

In [1]: my_tuple = (10, 20, 30)
   ...: new_positions = [2, 0, 1]
   ...: 

In [2]: my_shuffled_tuple = tuple(my_tuple[i] for i in new_positions)

In [3]: my_shuffled_tuple
Out[3]: (30, 10, 20)
Run Code Online (Sandbox Code Playgroud)

如果速度是一个问题,并且您正在处理大量数据,则应考虑使用Numpy.这允许使用列表或索引数组直接索引:

In [4]: import numpy as np

In [5]: my_array = np.array([10, 20, 30])

In [6]: new_positions = [2, 0, 1]  # or new_positions = np.array([2, 0, 1])

In [7]: my_shuffled_array = my_array[new_positions]

In [8]: my_shuffled_array
Out[8]: array([30, 10, 20])
Run Code Online (Sandbox Code Playgroud)