This question already has an answer here:
Peter Norvig has an essay describing a program to solve sudoku puzzles, even the hardest ones, by combining deterministic logical operations and smart traversal of the possible solutions. The latter is done recursively; here's that function (source):
def search(values): "Using depth-first search and propagation, try all possible values." if values is False: return False ## Failed earlier if all( len( values[s]) == 1 for s in squares): return values ## Solved! ## Chose the unfilled square s with the fewest possibilities _,s = min( (len( values[s]), s) for s in squares if len(values[s]) > 1 ) return some( search( assign( values.copy(), s, d)) for d in values[s] )
(I've added some spaces, CRs, and tabs for the sake of my eyes; apologies to Dr. Norvig.)
Right below the comment there's a line starting with "
_,s". That seems to be the unpacked tuple (
len(values[s]),s) with the minimal value of
s. Is Dr. Norvig using "
_" as a variable name just to indicate it's a "don't care" result, or is something else going on? Are there times when "
_" is recommended as a variable name? In interactive mode, "
_" holds the answer of the previous operation; is there a similar function in non-interactive code?
Thanks for the good answers. I guess The Answer goes to Alex Martelli for "value added"; he points out that the "_, vbl_of_interest" idiom is often a side effect of the DSU idiom, which itself has been made largely unnecessary.