首页 > 解决方案 > python将数组拆分为等效等级的子数组

问题描述

编辑:

我有一个n排序值的数组。

我想创建m个子数组,以便我的最佳元素进入我的第一个子数组,我的第二个元素进入我的第二个子数组等,我的第 n+1 个最佳元素进入我的第一个子数组。

如果我只有两个数组很容易,但如果我想要两个以上的子数组,我不知道该怎么做。

例如,如果我有一个初始数组:

a = [50, 45, 40, 35, 30, 25, 20, 10, 9, 8]

我想要 3 个我应该得到的子数组:

x1: [50, 35, 20, 8]
x2: [45, 30, 10]
x3: [40, 25, 9]

这样做的最有效/pythonic 方式是什么?

标签: pythonarrayspandasnumpy

解决方案


对于 2 个阵列

x1, x2 = map(list, zip(*zip(*[iter(a)] * 2)))

print(x1, x2, sep='\n')

[5, 3, 1]
[4, 2, 0]

对于 3 个阵列

x1, x2, x3 = map(list, zip(*zip(*[iter(a)] * 3)))

print(x1, x2, x3, sep='\n')

[5, 2]
[4, 1]
[3, 0]

为什么这有效

  1. iter(a)在 list 上创建一个迭代器a。当您迭代它时,元素会被用完,最终迭代器会耗尽。
  2. [iter(a)] * 2创建一个看起来像这样的列表i = iter(a); [i, i]。请注意,同一个迭代器出现了两次。这意味着当我从第一个中获取一个元素时i,我也会从第二个中获取它,i因为它们指向同一个迭代器。
  3. 所以!当我zip在同一个迭代器的解压列表上使用时zip(*[iter(a)] * 2),当我配对时,我从同一个迭代器中提取,因此自然会按照我们想要的顺序耗尽它们。
  4. 然后我使用另一个zip来转置结果,然后maplist它们制作列表而不是元组。

推荐阅读