首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不均匀子集genetarion的Python代码优化

不均匀子集genetarion的Python代码优化
EN

Stack Overflow用户
提问于 2021-12-14 17:37:56
回答 3查看 60关注 0票数 0

我想在优化代码方面寻求帮助。我列出了26个元素的列表:

代码语言:javascript
复制
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
  • 子集2&3 =>
  • 子集4-7 =>的第一、第二、第三和第四组数据
  • 子集8- 15 =>下1/8。

f 210

我在函数体中想出了一个相当草率而又冗长的解决方案,它是这样的:

代码语言:javascript
复制
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元素列表。只要元素是不同的。

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-14 19:46:27

您可以使用列表理解来获取以下子集:

代码语言:javascript
复制
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]

subsets = [indata[p*size:(p+1)*size] 
           for parts in (1,2,4,8) 
           for size in [len(indata)//parts] 
           for p in range(parts)]

输出:

代码语言:javascript
复制
for i,subset in enumerate(subsets,1): print(i,subset)

1 [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]

2 [0, 0, 50, 0, 32, 35, 151, 163, 9, 1, 3, 3, 42]
3 [30, 16, 14, 85, 44, 89, 26, 0, 67, 67, 23, 0, 0]

4 [0, 0, 50, 0, 32, 35]
5 [151, 163, 9, 1, 3, 3]
6 [42, 30, 16, 14, 85, 44]
7 [89, 26, 0, 67, 67, 23]

8 [0, 0, 50]
9 [0, 32, 35]
10 [151, 163, 9]
11 [1, 3, 3]
12 [42, 30, 16]
13 [14, 85, 44]
14 [89, 26, 0]
15 [67, 67, 23]

请注意,当列表的大小不是分区数目的倍数时(例如,26/4和26/8),这将删除项。有几种方法可以处理这个问题(更多的子集、较大的块、不同的子集大小来均匀或随机地分布项、添加到第一个子集、添加到最后一个子集、.)但你必须指明你想要哪一个。

例如,该变体将额外的项分散到前几组(每组不超过1项):

代码语言:javascript
复制
subsets = [indata[p*size+min(p,spread):(p+1)*size+min(p+1,spread)]
           for parts in (1,2,4,8)
           for size,spread in [divmod(len(indata),parts)]
           for p in range(parts)]

for i,subset in enumerate(subsets,1): print(i,subset,len(subset))

1 [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] 26

2 [0, 0, 50, 0, 32, 35, 151, 163, 9, 1, 3, 3, 42] 13
3 [30, 16, 14, 85, 44, 89, 26, 0, 67, 67, 23, 0, 0] 13

4 [0, 0, 50, 0, 32, 35, 151] 7
5 [163, 9, 1, 3, 3, 42, 30] 7
6 [16, 14, 85, 44, 89, 26] 6
7 [0, 67, 67, 23, 0, 0] 6

8 [0, 0, 50, 0] 4
9 [32, 35, 151, 163] 4
10 [9, 1, 3] 3
11 [3, 42, 30] 3
12 [16, 14, 85] 3
13 [44, 89, 26] 3
14 [0, 67, 67] 3
15 [23, 0, 0] 3
票数 2
EN

Stack Overflow用户

发布于 2021-12-14 19:21:05

代码语言:javascript
复制
def divide_data(data, chunks):
    idx = 0
    sizes = [len(data) // chunks + int(x < len(data)%chunks) for x in range(chunks)]
    for size in sizes:
        yield data[idx:idx+size]
        idx += size

data = list(range(26))  # or whatever, e.g. [0, 0, 50, ...]
for num_subsets in (1, 2, 4, 8):
    print(f'num subsets: {num_subsets}')
    for subset in divide_data(data, num_subsets):
        print(subset)
代码语言:javascript
复制
num subsets: 1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
num subsets: 2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
[13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
num subsets: 4
[0, 1, 2, 3, 4, 5, 6]
[7, 8, 9, 10, 11, 12, 13]
[14, 15, 16, 17, 18, 19]
[20, 21, 22, 23, 24, 25]
num subsets: 8
[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10]
[11, 12, 13]
[14, 15, 16]
[17, 18, 19]
[20, 21, 22]
[23, 24, 25]

归功于this answer的灵感

票数 0
EN

Stack Overflow用户

发布于 2021-12-14 20:49:12

您可以使用np.array_split +列表理解:

代码语言:javascript
复制
sublists = [arr.tolist() for num in [1,2,4,8] for arr in np.array_split(np.array(indata), num)]

输出:

代码语言:javascript
复制
[[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],
 [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],
 [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],
 [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]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70353282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档