python - 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 方式是什么?
解决方案
对于 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]
为什么这有效
iter(a)
在 list 上创建一个迭代器a
。当您迭代它时,元素会被用完,最终迭代器会耗尽。[iter(a)] * 2
创建一个看起来像这样的列表i = iter(a); [i, i]
。请注意,同一个迭代器出现了两次。这意味着当我从第一个中获取一个元素时i
,我也会从第二个中获取它,i
因为它们指向同一个迭代器。- 所以!当我
zip
在同一个迭代器的解压列表上使用时zip(*[iter(a)] * 2)
,当我配对时,我从同一个迭代器中提取,因此自然会按照我们想要的顺序耗尽它们。 - 然后我使用另一个
zip
来转置结果,然后map
用list
它们制作列表而不是元组。
推荐阅读
- excel - 由于公式中的撇号,无法在 VBA 中使用 INDIRECT 公式
- c# - 正则表达式与 C# 中的字符串格式不匹配
- excel - VBA UserForm 数据到模块
- java - 将 JSON 解析为 ListView Android
- python - 如果任何值不等于数字,我如何从 Pandas 数据框中选择行?
- spring-boot - 一个 Spring 应用程序中具有不同 errorDecoder 的多个 Feign 客户端
- python - 我如何从左到右绘制轮廓答题卡
- javafx - 再次按下按钮后,JavaFx 中的警报位置更改为默认值
- javascript - JavaScript。需要在函数内部连接两个数组
- python - 在 Python 中将日期时间索引与稍微不同的日期合并