Python:获取避免列表理解的列表子集

2024-06-28 19:55:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我经常会发现自己有一个对象列表,以及相关参数列表:param1、param2、param3等。我希望得到满足某些条件的参数的对象子集。 伪代码应该是:

subset = object if param1>10 and 5<param2-param3<6 and param4==1

我知道如何使用列表理解来做到这一点,但它变得很难看,而且很难被别人读懂。有其他选择吗? 例如,要将列表中的元素逐个添加,痛苦的是:

^{pr2}$

使用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]

做我想做的事,但我觉得不太优雅。更不用说非Python人很快就开始告诉你“超级魔果让它更容易”或者“你想让我为此放弃IDL!?”。在

你知道有没有其他的解决方案可以为这个特定的任务提供更好的语法?NumPy数组可以帮助简化语法吗?在


Tags: and对象numpy列表ifobjectitemarray
3条回答

您可以使用^{}或只使用for循环。在

Numpy阵列版本:

subset = objects[(param1>10) & (param2-param3>5) & (param2-param3<6) & (param4==1)]

但是[]中的每个操作都会创建一个临时数组,如果数组的大小很大,则可能需要进行一些优化。在

我认为,如果您适当地缩进,您的第二个示例可以非常可读:

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

相关问题 更多 >