[英]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.