基于python中的条件从列表生成多个列表

时间:2017-04-27 08:55:26

标签: python loops lambda list-comprehension

我有一个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次以便每次使用新的选择启发式时都会应用,感觉缓慢而无聊。

但问题是我实际上无法很好地生成三元组列表[[positive],[negative],[interval]]。 我使用的语法如

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

用于listoflists中listofnumbers的listofnumbers,用于listofnumbers中的数字\
 if number> 0 else [positivelist],[negativelist.extend(number)],[intervalist.extend(number)]]

但是说实话,这是不可读的,无论如何它没有做我想做的事,因为延长产量没有。
那么我怎么能不循环三次(我可以在列表列表中有数百万个元素,在子列表中,我可能想要对这些数字应用更复杂的公式,这是第一种方法) ?

我考虑过使用函数式编程,map / lambda;但它是unpythonic。问题是: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 个答案:

答案 0 :(得分: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])]]