簡體   English   中英

根據python中的條件從列表生成多個列表

[英]multiple list generation from a list based on condition in python

我有一個Pandas系列(可能是列表,這不是很重要),其中包含(為簡化起見,但也可能是單詞字母)正數和負數,例如

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次,每次使用新的選擇啟發法時都會感到緩慢而乏味。

但是問題是我實際上無法很好地生成三合會的列表[[正],[負],[間隔]]。 我正在使用類似的語法

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

用於列表列表中的數字列表用於列表列表中的數字\\
如果number> 0,則為[positivelist],[negativelist.extend(number)],[intervalist.extend(number)]]

但是,老實說,這是不可讀的,而且無論如何它都不能滿足我的要求,因為擴展不會產生任何結果。
因此,如何在不循環三次的情況下進行處理(我可能在列表列表和子列表中有數百萬個元素,並且我可能也想對這些數字應用更復雜的公式,這也是第一種方法) ?

我考慮過使用函數式編程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)

你怎么看?

你可以做:

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]

編輯 :Triad版本:

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])]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM