¿Significado de usar comas y guiones bajos con el operador de asignación de Python?

Leyendo a través de Peter NorvigResolviendo cada ensayo de rompecabezas de Sudoku, Me he encontrado con algunos modismos de Python que nunca he visto antes.

Soy consciente de que una función puede devolver una tupla / lista de valores, en cuyo caso puede asignar múltiples variables a los resultados, como

def f():
    return 1,2

a, b = f()

Pero, ¿cuál es el significado de cada uno de los siguientes?

d2, = values[s]  ## values[s] is a string and at this point len(values[s]) is 1

Silen(values[s]) == 1, entonces, ¿en qué se diferencia esta afirmación ded2 = values[s]?

Otra pregunta sobre el uso de un guión bajo en la tarea aquí:

_,s = min((len(values[s]), s) for s in squares if len(values[s]) > 1)

¿El subrayado básicamente tiene el efecto de descartar el primer valor devuelto en la lista?

Respuestas a la pregunta(4)

Su respuesta a la pregunta