python将数组拆分为等效级别的子数组

时间:2018-07-20 12:01:01

标签: python arrays pandas numpy

已编辑

我有一个 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]

最有效/最有效的方法是什么?

4 个答案:

答案 0 :(得分:2)

用于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)在列表a上创建一个迭代器。当您遍历所有元素时,这些元素就会用尽,最终迭代器将耗尽。
  2. [iter(a)] * 2创建一个看起来像i = iter(a); [i, i]的列表。请注意,相同迭代器出现了两次。这意味着当我从第一个i中获取一个元素时,我也从第二个i中获取了一个元素,因为它们指向同一个迭代器。
  3. 所以!当我在同一迭代器zip的未压缩列表中使用zip(*[iter(a)] * 2)时,当我将所有东西配对时,我是从同一迭代器中拉出的,因此自然会按照我们想要的顺序耗尽它们。
  4. 然后我使用另一个zip来转置结果,然后使用maplist来使它们成为列表而不是元组。

答案 1 :(得分:1)

对于X个列表:

一种可能是:

def get_sublists(original_list, number_of_sub_list_wanted):
    sublists = list()
    for sub_list_count in range(number_of_sub_list_wanted): 
        sublists.append(original_list[sub_list_count::number_of_sub_list_wanted])
    return sublists

然后您可以解压缩存储在sublist中的子列表。

例如:

a = [5,4,3,2,1,0]
x1, x2 = get_sublists(a, 2)

将为您提供预期的输出。

这是简单的解决方案。在itertools或其他lib中,它们可能更像pythonic。

如果您不了解此代码的工作原理,请查看the documentation of a slice

答案 2 :(得分:0)

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

def get_original_val(original, x):
    return [original[index] for index in x]

def get_index(a):
    index_x1, index_x2 = [], []
    local_list = a if not len(a) % 2 else a + [0]
    for idx, x in enumerate(local_list):
        target = index_x2 if idx % 2 else index_x1
        target.append(idx)
    get_x1 = get_original_val(a, index_x1)
    get_x2 = get_original_val(a,  index_x2)
    return get_x1, get_x2

>>>x1, x2 = get_index(a)
>>>x1
[5, 3, 1]
>>>x2
[4, 2, 0]

答案 3 :(得分:0)

下面将给出所需的答案,

a = [5, 4, 3 ,2, 1, 0]
a.sort(reverse=True)
x1 = []
x2 = []
for i in range(len(a)):
   x1.append(a[i]) if (i%2==0) else x2.append(a[i])
print x1, x2