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?
Update
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.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Yep, _ is a traditional name for “don’t care” (which unfortunately clashes with its use in I18N, but that’s a separate issue;-). BTW, in today’s Python, instead of:
_,s = min( (len( values[s]), s)
for s in squares
if len(values[s]) > 1
)
you might code
s = min((s for s in squares if len(values[s])>1),
key=lambda s: len(values[s]))
(not sure what release of Python Peter was writing for, but the idiom he’s using is an example of “decorate-sort-undecorate” [[DSU]] except with min instead of sort, and in today’s Python the key= optional parameter is generally the best way to do DSU;-).
Method 2
Your interpretation is correct. Outside of the special meaning in interactive mode _ is just used as a “don’t care” variable name, especially in unpacking.
Method 3
You are correct. In non-interactive mode _ has no special meaning. Indeed, Norvig just wants to convey that he doesn’t care about the value of that variable.
Offtopic: That article by Norvig is very nice. A recommended read.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0