Escribí el siguiente código (basado en algunas instrucciones explicadas en la cadena de documentación):

def find_correct(answer, guess):
'''
(list, list) -> list
Given the answer code and a guess code, return
a list containing the string 'b' for each correctly positioned
colour in the guess. For example, if answer is 'YOGB' and guess is
'RTLB', ['b'] will be returned since index 3 in both is B. If answer is 'YOGB'
and guess is 'YTLB', ['b','b'] will be returned since index 0 in both is Y and
index 3 in both is B (ie. two 'b's in the list since two indexes match)
'''
for i in range(len(guess)):
    if answer[i] == guess[i]:
        return ['b']

Sin embargo, esto solo devuelve una ['b'] sin importar cuántos índices coincidan (a menos que ninguno coincida, en cuyo caso no se devuelve nada), ya que acabo de escribir return ['b']. No sé cómo hacer que devuelva más de uno b. Intenté algunas cosas como:

 return ['b'] for i in range(len(guess)):
     if answer[i] == guess[i]

Y haciendo

  return ['b'] * i

Pero obviamente ninguno de estos funciona por razones que creo que entiendo (pero pensé que lo intentaría de todos modos). ¿Hay una manera fácil de hacer que el código haga lo que quiero sin volver a escribir completamente el código que ya escribí o debería volver al tablero de dibujo? ¿Tal vez hay alguna forma en que podría usar la función a.count (b) y luego multiplicar ese resultado por ['b']? Solo una idea con la que he estado tratando de trabajar. ¡Gracias!

0
Rir8 27 oct. 2017 a las 20:15

4 respuestas

La mejor respuesta

Puede ser que quieras esto:

def find_correct(answer, guess):
    l=[]
    for i in range(len(guess)):
        if answer[i] == guess[i]:
            l.append('b')
    return l
print(find_correct('YOGB','RYLB'))

Salida:

['b']

Recuerde que siempre que se encuentre return, saldrá de la función. Entonces, haga una lista y devuélvala al final.

Si quieres un trazador de líneas,

def find_correct(answer, guess):
    return ['b' for i in range(len(guess)) if answer[i] == guess[i]]
0
Miraj50 27 oct. 2017 a las 17:26

La mejor manera de lograr esto es a través de una lista de comprensión.

def find_correct(answer, guess):
    return ['b' for a,g in zip(answer, guess) if a == g]

Lo que esto hace es iterar a través de answer y guess un elemento a la vez y agregar 'b' a la nueva lista si los elementos son los mismos.

zip toma una serie de iteradores y devuelve un iterador eso da una tupla con cada elemento siendo el siguiente elemento del iterador correspondiente.

0
yinnonsanders 27 oct. 2017 a las 17:28

Estás cerca de la respuesta correcta! Como muchos han dicho, solo necesita hacer una lista y agregarle 'b' hasta que haya terminado. ¡Entonces, devuelve esa lista! Vea abajo:

def find_correct(answer, guess):
    return_list = []
    for i in range(len(guess)):
        if answer[i] == guess[i]:
            return_list.append('b')
    return return_list
0
knowa42 27 oct. 2017 a las 17:25

Otra forma de usar itertools y product, y como otros sugirieron usar lists:

def find_correct(answer, guess):
    l = [(a,b) for a,b in itertools.product(answer, guess) if a==b]  
    return ['b']*len(l)

find_correct('YOGB','RTLB')
['b']

find_correct('YOGB','YTLB')
['b', 'b']

find_correct('RYLB','RGBY')
['b', 'b', 'b']
0
skrubber 27 oct. 2017 a las 17:36