2016-06-09 3 views
3

Мой код выглядит следующим образом:код оптимизации питон петли

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

Примечание: query.orderby список Dict. Выглядит что-то вроде [{"severity": "asc"}, {"name": "desc"}] Как я могу оптимизировать эти строки? Есть ли способ заменить цикл for и получить такую ​​же функциональность, как и код выше?

+0

какая логика в инструкции if? –

+0

[Что означает «понимание списка» в Python? Как это работает и как я могу его использовать?] (Http://stackoverflow.com/q/34835951) –

+3

Это зависит от того, что вы хотите сделать после последнего 'if'. – Kasramvd

ответ

1

Это трудно дать вам оптимизировать, не понимая, что происходит в 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'] 
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: 

в свете 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() , как было предложено Андреем Ивановичем, но проще

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

for q in orderby: 
    if 'severity' in q: 
     ... 
Смежные вопросы