Gregory Guthrie wrote: > Sorry for a simple question- but I don't understand how to parse this use of > a list comprehension. > > The "or" clauses are odd to me. > > It also seems like it is being overly clever (?) in using a lc expression as > a for loop to drive the recursion. > > Thanks for any insight! > Gregory > ------------------------- > > # http://markbyers.com/moinmoin/moin.cgi/ShortestSudokuSolver > > def solve(board): > i=board.find('0') # find next open cell > if i<0: # done if none... > print board; exit("Done") > [ m in [(i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3) > or board[j] for j in range(81) ] > or solve(board[:i]+m+board[i+1:]) for m in'%d'%5**18 ] >
The "or" clause (as you call it) has nothing to do with the list comprehension. The syntax being used here is [ big_expression for m in something] *and* the big_expression contains an "or" OPERATOR, with a complex_expression on one side and solve(...) on the other, like this complex_expression or solve(...) *and* the complex_expression contains a nested list comprehension like this m in nested_lc *and* nested_lc is [ugly_expression for j in range(81)] *and* ugly_expression contains another "or" OPERATOR with ... *and* sigh... Whoever put this expression together has made something that is completely unreadable, mostly unmaintainable, and not noticeably more efficient than code that is readable and maintainable. Moreover, all the work of creating the outer list seems to be wasted since that list is just thrown out. This is worse than "overly clever". Loops are for looping, list comprehension is for building lists. It is bad programming practice to use list comprehension for looping. Hope that helps you, Gary Herron > > > ----== Posted via Newsfeeds.Com - Unlimited-Unrestricted-Secure Usenet > News==---- > http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ > Newsgroups > ----= East and West-Coast Server Farms - Total Privacy via Encryption =---- > -- http://mail.python.org/mailman/listinfo/python-list