2011-03-14 54 views
3

我有一个相当长的Python列表,我想根据3个百分比在单个较短的列表中返回它的一部分。如果第一个百分比是30%,则需要返回前30%的值,如果第三个百分比是50%,则需要返回长列表的后半部分值。Python - 根据计算出的百分比返回一个列表的区域

这是我迄今为止,它有问题,具有舍入,是一个丑陋的解决方案

class OM(): 
    def __init__(self,name): 
     self.name = name 
     self.total = 120 
     self.a = 21 
     self.b = 34 
     self.c = 65 

    def hRange(self,action): 
     if self.total > 0: 
     a_perc = int(self.a/float(self.total) *169) 
     b_perc = int(self.b/float(self.total) *169) 
     c_perc = int(self.c/float(self.total) *169) 
     if action=='a': return lst[:aperc] 
     elif action=='b': return lst[a_perc:a_perc+b_perc] 
     elif action=='c': return lst[-c_perc:] 

     else: 
     raise Exception 

我知道这是不是很好,在所有编码(硬编码善堂长度169,没有按不会采取不同的行动等)我只是想帮助解释我正在尝试做什么。

在我的实际实现中,总的值a,b,c将初始化为0,另一种方法会更新它们,因为它们只是理货。我只是将它们设置为一些随机值,以便代码返回百分比。

我会非常感激,如果有人可以给我任何建议,如何去做这个更好的方法。

回答

1

得到冲昏头脑的通用解决方案......我相信这应该处理所有情况:

def split_list(mylist, *args): 
    ilist = map(lambda p : int(p * len(mylist)/100.0), args) + [len(mylist)] 
    return reduce(lambda l, v : [l[0] + [mylist[l[1]:v]], v], ilist, [[],0])[0] 

该函数将列表和一个百分比分列表(按顺序),并根据需要返回列表。处理分裂的百分比多于列表中的项目的情况。

+0

哇,谢谢!这非常令人印象深刻!我已经阅读了地图,缩小,过滤,lambda和列表理解。首先了解这个功能是如何工作的,其次是因为它们非常有用! – GP89 2011-03-16 14:45:52

2

如果我理解正确的话,你要保持三个列表,基于在开始和结束加上“之间”一定比例:

def split_list(mylist, a, b): 
    l = len(mylist) 
    return (mylist[:int(a*l/100)], 
      mylist[int(a*l/100):-int(b*l/100)], 
      mylist[-int(b*l/100):]) 

其中A和B是百分比(根据给定0至100)。它与您的实现几乎相同,但您只需要使用两个百分比(如果中间列表是两端都被裁掉的剩余部分)。我把它留给你在你的代码将这一...

+0

啊谢谢你,你说得对 - 我只需要两个百分比,实际上我根本不需要计算总计或总计。 我只是意识到我的百分比变量甚至不是百分比,我是一个非常糟糕的尝试:P – GP89 2011-03-16 14:41:18

+0

是的,您唯一想要添加的是一种机制,用于检查百分比不超过100%根据你的需要,它们不重叠(即a = 65,b = 65)。 – Benjamin 2011-03-16 14:43:18