我经常发现自己有一个对象列表和相关参数列表:param1、param2、param3 等。我想获得具有满足某些条件的参数的对象子集。伪代码将是:
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 数组能否再次帮助简化语法?