我經常發現自己處於一個有對象列表和相關參數列表的情況:param1,param2,param3等。我想獲得具有滿足一些條件的參數。 僞代碼將是:Python:獲取列表的子集避免列表理解
subset = object if param1>10 and 5<param2-param3<6 and param4==1
我知道該怎麼做,使用列表解析,但它得到相當難看,而且很難被別人閱讀。有替代品嗎? 例如,由兩名添加列表兩個元素,痛苦的:
list1=[1,2,3,4]
list2=[10,10,10,10]
[item[0]+item[1] for item in zip(list1,list2)]
>>> [11, 12, 13, 14]
看起來瞬間更清晰的使用與NumPy數組而不是列表解析:
import numpy
list1=numpy.array([1,2,3,4])
list2=numpy.array([10,10,10,10])
list1 + list2
>>> array([11, 12, 13, 14])
和清晰度增益獲得時更大你開始在兩個以上的列表上做一些非平凡的操作。
返回我的對象列表中選擇只有一些行的最初的問題:
subset = [item[0] for item in zip(object,param1,param2,param3,param4) if item[1]>10 and item[2]-item[3]>5 and item[2]-item[3]<6 and item[4]==1]
或:
subset = [obj for obj,p1,p2,p3,p4 in zip(object,param1,param2,param3,param4) if p1>10 and p2-p3>5 and p2-p3<6 and p4==1]
執行正是我想要的,但我沒有找到很優雅。更不用說非pythoneers快速開始告訴你「SuperMongo使它更容易」或「你希望我放棄IDL這個!」。
您是否知道爲此特定任務提供更好語法的替代解決方案? NumPy數組可以再次幫助簡化語法嗎?
我認爲這正是我一直在尋找的! 獎勵:現在我想到了一種方法來返回對象的位置而不是對象本身。 index_of_subset = numpy。array(range(len(object)))[(param1> 10)&(param2-param3> 5)&(param2-param3 <6)&(param4 == 1)] works。可能有更聰明的做法。 – user2115545 2013-02-27 14:33:12