Python循环代码优化

3

我的代码如下:

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

注意:query.orderby是一个包含字典的列表,看起来像这样 [{"severity": "asc"},{"name": "desc"}] 如何优化这些代码行?有没有办法替换for循环并且仍然获得与上述代码相同的功能?

if语句中的逻辑是什么? - Andriy Ivaneyko
3
这取决于你在最后一个“if”之后想要做什么。 - Mazdak
你写道:“query.orderby是一个字典列表”。如果query总是有一个属性.orderby,那么你的第一个if(if query.orderby:)是多余的。否则,你的for循环后面跟着一个if,至少在我看来,和一个迭代过滤版本的query.orderby相比,例如for q in (q in query.orderby if 'severity' in q),它是一样好的——你目前的实现(除了第一个可以被删除的if)增加了一个缩进级别,但以更清晰的方式表达了你的目的。 - gboffi
好的,那么你的代码已经是尽可能优秀的了... - gboffi
@gboffi 感谢您的帮助。 - NSP
显示剩余5条评论
4个回答

1

如果不了解 if condition 中发生了什么,很难为您提供优化建议,但是如果循环的结果是列表,则可以使用 列表推导式

# ensure query.order_by is iterable
query.order_by = query.orderby if geattr(query, 'orderby', None) else []
result = [ item for item in query.order_by if 'severity' in item]

另一个不错的选择是在迭代之前过滤项目:
query.order_by = query.orderby if geattr(query, 'orderby', None) else []
for item in filter(lambda x: 'severity' in x, items):
    print item['severity']

1
类似这样的内容:
filtered = [q for q in query.orderby if 'severity' in q]

会过滤到一个新列表中。

1
如果query.orderby是一个字典列表,那么你应该按照以下方式进行:
x = [{"severity": "asc"}, {"name": "desc"}]

for e in x:
    for key, value in e.iteritems():
        if 'severity' in key:
            print 'yes'

0

你的初始声明

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

我的建议是使用 try ... except 语句块

try:
    orderby = query.orderby
except AttributeError:
    orderby = []

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

或者是基于 getattr() 的解决方案,正如 Andriy Ivaneyko 提出的那样,但更简单。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接