Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python循环的代码优化_Python_Performance_Loops - Fatal编程技术网

python循环的代码优化

python循环的代码优化,python,performance,loops,Python,Performance,Loops,我的代码如下所示: if query.orderby: for q in query.orderby: if 'severity' in q: filtered = [q for q in query.orderby if 'severity' in q] 注意:query.orderby是dict.的列表 [{“严重性”:“asc”},{“名称”:“描述”}] 如何优化这些线路?是否有任何方法可以替换for循环并仍然获得与上述代码相同的功能?如果不了解条件下的情况,

我的代码如下所示:

if query.orderby:
    for q in query.orderby:
        if 'severity' in q:
filtered = [q for q in query.orderby if 'severity' in q]
注意:query.orderby是dict.的列表 [{“严重性”:“asc”},{“名称”:“描述”}]
如何优化这些线路?是否有任何方法可以替换for循环并仍然获得与上述代码相同的功能?

如果不了解
条件下的情况,则很难为您提供优化,但是如果该循环的结果是列表-您可以使用:

另一个不错的选择是在迭代项目之前对其进行过滤:

query.order_by = query.orderby if geattr(query, 'orderby', None) else []
for item in filter(lambda x: 'severity' in x, items):
    print item['severity']
大概是这样的:

if query.orderby:
    for q in query.orderby:
        if 'severity' in q:
filtered = [q for q in query.orderby if 'severity' in q]

如果query.orderby是一个dict列表,则会过滤到一个新列表中,如下所示:

x = [{"severity": "asc"}, {"name": "desc"}]

for e in x:
    for key, value in e.iteritems():
        if 'severity' in key:
            print 'yes'
你最初的陈述

if query.orderby:
根据我的一个评论

orderby
不必总是出现

不是你想要的。。。看看这个互动环节

In [1]: class Query(): pass

In [2]: query = Query()

In [3]: query.orderfrom = 1

In [4]: if query.orderfrom: print(1)
1

In [5]: if query.orderby: print(1)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-27f5f9b9569b> in <module>()
----> 1 if query.orderby: print(1)

AttributeError: 'Query' object has no attribute 'orderby'

In [6]: 
或者是一个基于安德烈·伊万尼科提出的
getattr()
,但更简单的解决方案

 # use getattr to have the attribute OR a convenient, here [], default.
 orderby = getattr(query, 'orderby', [])

 for q in orderby:
     if 'severity' in q:
         ...

if语句中的逻辑是什么?这取决于在上次
if
之后要执行的操作。基本上,如果键“severity”存在,我会更改其值,并根据您编写的键值“query.orderby是dict的列表”对数组项进行排序。如果
query
始终具有一个属性
.orderby
,那么您的第一个
If
If query.orderby:
)就是超级链接。否则,至少在我看来,您的
for
循环后跟
if
是一个更复杂的解决方案,它可以迭代
查询的过滤版本。orderby
,例如,
for q in(q in query.orderby如果q中的“严重性”
——您当前的实现(如果可以删除第一个
,则对第一个
进行模化)增加了缩进级别,但以更清晰的方式表达了您的目的