2014-11-13 2 views
3

У меня есть понимание списка, которое, я надеюсь, более показательно, чем эквивалент цикла. Тем не менее, я не уверен, как python оценивает понимание. Если он сначала оценивает ширину, то операция является дорогостоящей, однако представляется целесообразным оценивать их все на каждом шаге, требуя, чтобы данные оценивались один раз и проходили через петли. Ниже приводится список, о котором я спрашиваю.оценка понимания списков python

[(Counter(x.keys()), x) for x in [Counter([hashxx(w)%100000 for w in n.split()]) for n in x]] 

Как это будет оцениваться? будет ли вычисляться хэш, а затем пузырь до внешнего цикла или все хэши будут вычисляться в первую очередь?

+0

Я считаю, что вы можете сделать [ 'генератор expressions'] (https://docs.python.org/2/reference/expressions.html#generator-expressions) , заменяя квадратные скобки во внутренних списках с помощью круглых скобок, таким образом вы получаете оценки внутренних выражений, когда вы идете, по одному за раз. –

+0

Да, это то, что я сейчас делаю, но мне интересно узнать, как оцениваются понятия python. – ragingSloth

ответ

4

Понимание списка всегда полностью оценивается там, где оно происходит, как и любое другое выражение, например a+b. Понимание списка не «знает», что оно находится внутри другого понимания списка, поэтому оно не может вести себя иначе по этой причине.

Если вы хотите итерировать «бит за битом», генерируя только один элемент из понимания списка за раз, затем используйте generator expression.

Вот простое сравнение:

def inner(x): 
    print("inner") 
    return x.upper() 

def outer(x): 
    print("outer") 
    return x+"!" 

# inner comprehension is a list comprehension 
>>> [outer(x) for x in [inner(x) for x in ('a', 'b', 'c')]] 
inner 
inner 
inner 
outer 
outer 
outer 
['A!', 'B!', 'C!'] 

# inner comprehension is a generator comprehension 
>>> [outer(x) for x in (inner(x) for x in ('a', 'b', 'c'))] 
inner 
outer 
inner 
outer 
inner 
outer 
['A!', 'B!', 'C!'] 
Смежные вопросы