2011-03-14 53 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