【问题标题】:Code optimization python loops [closed]代码优化python循环[关闭]
【发布时间】:2016-10-09 19:53:13
【问题描述】:

我的代码如下所示:

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

注意:query.orderby 是一个字典列表。看起来像 [{“严重性”:“asc”},{“名称”:“desc”}] 我怎样才能优化这些线?有什么方法可以替换 for 循环,并且仍然获得与上面代码相​​同的功能?

【问题讨论】:

  • if语句的逻辑是什么?
  • 这取决于你想在最后if之后做什么。
  • 基本上,如果存在“严重性”键,我会更改其值并根据键值对数组项进行排序
  • 你写了“query.orderby 是一个字典列表”。如果query 始终具有.orderby 属性,那么您的第一个if (if query.orderby:) 是多余的。否则,您的for 循环后跟if 至少在我看来,与迭代query.orderby 的过滤版本的更复杂的解决方案一样好,例如for q in (q in query.orderby if 'severity' in q) — 您当前的实现(模第一个if,可以删除)添加了一定程度的缩进,但以更简洁的方式表达了您的目的

标签: python performance loops


【解决方案1】:

类似这样的:

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

将过滤到新列表中

【讨论】:

    【解决方案2】:

    如果 query.orderby 是一个 dict 列表,那么你应该这样做:

    x = [{"severity": "asc"}, {"name": "desc"}]
    
    for e in x:
        for key, value in e.iteritems():
            if 'severity' in key:
                print 'yes'
    

    【讨论】:

      【解决方案3】:

      如果不了解 if condition 中发生的情况,很难为您提供优化,但是如果该循环的结果是列表 - 您可以使用 list comprehension

      # 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']
      

      【讨论】:

        【解决方案4】:

        你的初始陈述

        if query.orderby:
        

        根据your answer我的评论

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-03
          • 2011-11-02
          • 1970-01-01
          • 2011-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-12
          相关资源
          最近更新 更多