2017-04-27 89 views
0

我有一個熊貓系列(可能是一個列表,這不是很重要)的列表,其中包含(簡化,但也可以是字母)正和負號, 如根據python中的條件從一個列表生成多個列表

0 [12,-13,0,6] 
1 [2,-3,8,233] 
2 [0,6,8,3] 

對於每個這些例如,我想填寫一列的三列中的數據幀,其中所有正的值的列表,所有負的值的列表,以及列表所有值都包含在某個區間中。如:

[[12,6],[-13],[0,6]] 
[[2,8,233],[-3],[2,8]] 
[[6,8,3],[],[6,8,3]] 

我首先想到的是用一個列表解析生成列表的三元名單,這將使用pd.DataFrame向右形式轉換的列表。 這是因爲我不想遍歷列表的列表3次,每次應用新的選擇啓發式時,感覺緩慢和沉悶。

但問題是我實際上無法很好地生成黑社會名單[[positive],[negative],[interval]]。 我使用的語法等

[[[positivelist.extend(number)],[negativelist], [intervalist.extend(number)]]\ 

在listoflists用於listofnumbers數listofnumbers \
如果數量> 0,否則,[positivelist],[negativelist.extend(數)],[intervalist.extend(號碼) ]]

但讓老實說,這是不可讀的,無論如何,它不做我想要的,因爲擴展沒有收益。
那麼我怎麼能沒有循環三次(我可以在列表列表中有數百萬個元素,並且在子列表中,並且我可能希望對這些數字應用更復雜的公式,這是第一次做法)?

我想過使用函數式編程,map/lambda;但它是和諧的。問題是:python中的內容可能有助於做到這一點?

我的猜測是一些爲:

newlistoflist=[] 
for list in lists: 
    positive=[] 
    negative=[] 
    interval=[] 
    for element in list: 
     positive.extend(element) if element>0 
     negative.extend(element) if element<0 
     interval.extend(element) if n<element<m 
    triad=[positive, negative,interval] 
newlistoflist.append(triad) 

你覺得呢?

回答

1

你可以這樣做:

import numpy 
l = [[12,-13,0,6], [2,-3,8,233], [0,6,8,3]] 
l = numpy.array([x for e in l for x in e]) 
positive = l[l>0] 
negative = l[l<0] 
n,m = 1,5 
interval = l[((l>n) & (l<m))] 
print positive, negative, interval 

輸出:[ 12 6 2 8 233 6 8 3] [-13 -3] [2 3]

編輯:黑社會版本:

import numpy 
l = numpy.array([[12,-13,0,6], [2,-3,8,233], [0,6,8,3]]) 
n,m = 1,5 
triad = numpy.array([[e[e>0], e[e<0], e[((e>n) & (e<m))]] for e in l]) 
print triad 

輸出:

[[array([12, 6]) array([-13]) array([], dtype=int64)] 
[array([ 2, 8, 233]) array([-3]) array([2])] 
[array([6, 8, 3]) array([], dtype=int64) array([3])]] 
+0

臨屋這是一個開始,但它不會做我想要的。對於每個列表,我想要一個三元組: [[12,6],[ - 13],[0,6]] [[2,8,233],[ - 3],[2, 8]] [[6,8,3],[],[6,8,3]] –

+0

你可以給'n,m'間隔嗎? – Nuageux

+1

@AndoJurai:如果你改變'n,m'值就應該是它。 – Nuageux