【发布时间】:2022-01-18 00:35:46
【问题描述】:
我想在优化代码方面寻求帮助。 我有一个 26 个元素的列表:
indata = [0, 0, 50, 0, 32, 35, 151, 163, 9, 1, 3, 3, 42, 30, 16, 14, 85, 44, 89, 26, 0, 67, 67, 23, 0, 0]
仅供进一步阅读:当我提到“子集”时 => 是数据的子“集”,而不是数据类型。我正在寻找“子列表”。
我正在准备一个函数,它将对该列表的子集执行进一步的计算。问题是,如果子集是在奇数上生成的,有时相同的元素会两次或更多地进入不同的子集。我正在寻找的子集是:
- 子集 1 => 原始数据
- 子集 2 & 3 => 数据的前半部分和后半部分
- 子集 4 - 7 => 1/4 数据的第一个、第二个、第三个和第四个
- 子集 8 - 15 => 集的下一个 1/8。
我在函数体内想出了一个相当草率且冗长的解决方案,如下所示:
for i in iterate:
if i == 0:
subset = indata
elif i == 1:
subset = indata[0:int(len(indata)/2)]
elif i == 2:
subset = indata[int(len(indata)/2):]
elif i == 3:
subset = indata[0:int(len(indata)/4)]
elif i == 4:
subset = indata[int(len(indata)/4):int(round((len(indata)/4)*2,0))]
elif i == 5:
subset = indata[int(round((len(indata)/4)*2,0)):int(round((len(indata)/4)*3,0))]
elif i == 6:
subset = indata[int(round((len(indata)/4)*3,0)):]
elif i == 7:
subset = indata[0:int(len(indata)/8)]
elif i == 8:
subset = indata[int(len(indata)/8):int(round((len(indata)/8)*2,0))]
elif i == 9:
subset = indata[int(len(indata)/8)*2:int(round((len(indata)/8)*3,0))]
elif i == 10:
subset = indata[int((len(indata)/8)*3+0.25):int(round((len(indata)/8)*4,0))]
elif i == 11:
subset = indata[int((len(indata)/8)*4+0.25):int(round((len(indata)/8)*5,0))]
elif i == 12:
subset = indata[int((len(indata)/8)*5+0.25):int(round((len(indata)/8)*6,0))]
elif i == 13:
subset = indata[int((len(indata)/8)*6+0.5):int(round((len(indata)/8)*7,0))]
elif i == 14:
subset = indata[int((len(indata)/8)*7+0.5):]
else:
subset = indata[int((len(indata)/8)*7+0.5):]
-here go further instruction on the subset, then loop go back and repeat.
它做了它应该做的(添加的 0.25 和 0.5 部分是为了避免包含相同的元素进入两个或多个子集,假设子集的长度为 3.25)。 但是,肯定有更好的方法来做到这一点。 我不介意有不均匀的集合,比如说,当除以 4 有 2 个 7 元素列表和 2 个 6 元素列表时。只要元素是不同的。
感谢您的帮助。
【问题讨论】:
-
第一个改进是使用键计算字典:子集编号和值:(start_index, end_index),其中索引是根据 indata 的长度计算的
-
也许可以使用itertools库——有一种方法叫grouper,不过我自己没用过这个
标签: python list optimization subset