On Apr 12, 10:28 am, Steven Bethard <[EMAIL PROTECTED]> wrote: > Drew wrote: > > On Apr 11, 11:27 pm, Steven Bethard <[EMAIL PROTECTED]> wrote: > >> Drew wrote: > >>> def known_edits2(word): > >>> return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in > >>> NWORDS) > > >> This is the same as: > > >> result = set() > >> for e1 in edits1(word): > >> for e2 in edits1(e1): > >> if e2 in NWORDS: > >> result.add(e2) > >> return result > > >> The thing between the ``set(`` and ``)`` is called a generator > >> comprehension if you'd like to look into it further. > > > Thanks for the response. I'm somewhat familiar with generator/list > > comprehension but was unsure how multiple statements were evaluated > > when chained together. From your explanation, I'm assuming they are > > evaluated from the "inside out" rather than left to right or right to > > left. > > > Does the mean that the comprehension on the inside is always evaluated > > first? > > Not really (at least for the most literal interpretation of ``evaluated > first``). I find it easiest to think of translating them into regular > for loops by adding the appropriate indentation. > > Starting with: > > (e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS) > > Adding newlines: > > (e2 > for e1 in edits1(word) > for e2 in edits1(e1) > if e2 in NWORDS) > > Adding indentation: > > (e2 > for e1 in edits1(word) > for e2 in edits1(e1) > if e2 in NWORDS) > > Moving the add/append to the bottom: > > for e1 in edits1(word) > for e2 in edits1(e1) > if e2 in NWORDS > e2 > > Adding the remaining boiler-plate: > > result = set() > for e1 in edits1(word): > for e2 in edits1(e1): > if e2 in NWORDS: > result.add(e2) > > So multiple for- and if-expressions are evaluated in the same order that > they would normally be in Python, assuming the proper whitespace was added. > > HTH, > > STeVe
Wow, thanks for having the patience to write that out. This makes perfect sense now. -Drew -- http://mail.python.org/mailman/listinfo/python-list