已编辑
:我有一个 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]
最有效/最有效的方法是什么?
答案 0 :(得分:2)
x1, x2 = map(list, zip(*zip(*[iter(a)] * 2)))
print(x1, x2, sep='\n')
[5, 3, 1]
[4, 2, 0]
x1, x2, x3 = map(list, zip(*zip(*[iter(a)] * 3)))
print(x1, x2, x3, sep='\n')
[5, 2]
[4, 1]
[3, 0]
iter(a)
在列表a
上创建一个迭代器。当您遍历所有元素时,这些元素就会用尽,最终迭代器将耗尽。[iter(a)] * 2
创建一个看起来像i = iter(a); [i, i]
的列表。请注意,相同迭代器出现了两次。这意味着当我从第一个i
中获取一个元素时,我也从第二个i
中获取了一个元素,因为它们指向同一个迭代器。zip
的未压缩列表中使用zip(*[iter(a)] * 2)
时,当我将所有东西配对时,我是从同一迭代器中拉出的,因此自然会按照我们想要的顺序耗尽它们。zip
来转置结果,然后使用map
和list
来使它们成为列表而不是元组。答案 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