Tengo dos funciones relacionadas entre sí: la primera elimina los caracteres que son iguales y están en la misma posición, y devuelve las que no coinciden:

def remove(l1, l2):
    r = []
    for char in range(len(l1)):
        if l1[char] != l2[char]:
            r.append(l1[char])
    return r

Si bien esta función pasa por ambas listas y elimina los mismos valores utilizando la función anterior. Luego, usando lo que queda, encuentra valores que son iguales en b (pero no necesitan estar en la misma posición).

def search(a, b):
    found = []
    elim = remove(a, b) 
    for char in elim:
        if char in b:
            find = 'y'
            found.append(find)
    return found

Si bien puedo devolver la cantidad correcta de 'y' para los otros ejemplos que uso, se rompe cuando tengo más de uno del mismo valor. Si solo hay 1 'V' en la lista 'b', pero 2 en la lista 'a', solo quiero que se devuelva 1 'y', no 2. Ya que no estoy seguro de a dónde ir desde aquí, mi función devuelve esto:

    search(['L', 'F', 'V', 'V'], ['V', 'F', 'O', 'R'])
Expected:
    ['y']
Got:
    ['y', 'y']

¡Gracias de antemano!

-1
Athena 29 oct. 2017 a las 08:51

3 respuestas

La mejor respuesta

Probar esto

def remove(l1, l2):
    r = []
    print l1
    print l2
    for char in range(len(l1)):
        if l1[char] != l2[char]:
            #the below line your code appending index of char , i am appending char
            r.append(l1[char])
    return r


def search(a, b):
    found = []
    elim = remove(a, b)
    print elim
      #the below line your code iterating through all chars of elim , i am looping through only unique ones using set 
    for char in set(elim):
        if char in b:
            find = 'y'
            found.append(find)
    return found
1
Sandeep Lade 29 oct. 2017 a las 06:09

Esto debería funcionar para usted:

def remove(l1, l2):
    return [char1 for char1, char2 in zip(l1, l2) if char1 != char2]

def search(a, b):
    elim = remove(a, b)
    return ['y' for char in set(elim) if char in b]

print(search(['L', 'F', 'V', 'V'], ['V', 'F', 'O', 'R']))

Salida: ['y']

Usé set(elim) para eliminar los duplicados de la lista creada por remove().

2
gommb 29 oct. 2017 a las 06:12

Cambie su segunda función a esto:

def search(a, b):
    found = []
    elim = remove(a, b) 
    for char in elim:
        if a[char] in b:
            find = 'y'
            found.append(find)
            b.remove(a[char])
    return found

Esto tiene en cuenta que elim contiene índices en lugar de caracteres. Eliminará una 'V' de b cada vez que una 'V' sea indexada por elim. Pero si ambas listas contienen dos 'V' obtendrá dos 'y'. No sé si eso es lo que quieres. Su declaración del problema no está clara. Pero estoy bastante seguro de que eres un principiante de Python y no estás listo para usar los conceptos avanzados de las otras respuestas.

1
Paul Cornelius 29 oct. 2017 a las 06:46