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

标签 python list list-comprehension

我经常发现自己处于这样的情况:我有一个对象列表和关联参数列表: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]

完全执行我想要的操作,但我觉得这不太优雅。更不用说非 Python 人员很快就会开始告诉你“SuperMongo 让事情变得更容易”或者“你想让我为此放弃 IDL!?”。

您是否知道可以为此特定任务提供更好语法的替代解决方案? NumPy 数组可以再次帮助简化语法吗?

最佳答案

我认为如果您正确缩进,您的第二个示例可以变得非常可读:

[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:获取列表的子集,避免列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114034/

相关文章:

python - 如何从 numpy 数组中快速获取特定索引?

python - 为什么 Python 带有参数的 raise 需要解包?

python - 我们能在列表中找到素数吗?

python - 如何在列表理解中打印多个值?

python - 在列表理解中重复调用方法

python - 在列表理解中解包列表

python - 增加 sigmoid 预测输出值?

python - 将嵌套列表转换为字符串

python - 如何检查两个元组列表是否相同

Python:比较两个列表并获得带符号的最大值和最小值