Problema con funzione di controllo accetabilità soluzione in cabala Https://training.olinfo.it/#/task/ois_cabala/statement

Sto risolvendo cabala ma ho un piccolo problemino con il controllo del numero per vedere se questo ha 2 cifre uguali consecutive. Il codice che ho scritto in python per il controllo è questo:

def controllino(l):
	new_list = []
	for element in l:
		if element not in new_list:
			new_list += [element]
	l = new_list

	for element in l:
		for i in range(len(element)-1):
			if element[i] == element[i+1]:
				l.remove(element)
				print(element)
				break			
	return l

Questa funzione nella prima parte (rimuovere eventuali duplicati) riesce, nella seconda parte (rimuovere numeri con cifre consecutive uguali) riesce solo in parte non rimuovendo tutte le occorenze. Grazie per chi cercherà di aiutare :slight_smile:

Ciao, potresti fornire un valore di esempio per la variabile l? In questo modo è più semplice capire cosa non funziona nel codice da te fornito.

Ho risolto e alla fine il problema era questo ciclo:

Poiché rimuovevo elementi dalla lista sulla quale ciclavo, mandando in vacca tutto. Alla fine mi è bastato fare così per risolvere:

	n = new_list
	l = n.copy()
	for element in l:
		for i in range(len(element)-1):
			if element[i] == element[i+1]:
				n.remove(element)
				break			

Ciclando sulla lista “copia” ed eliminando dalla lista “n” che poi ritorna

Immaginavo fosse un problema del genere… Sono contento che tu sia riuscito a risolvere! Una piccola ottimizzazione potrebbe essere quella di usare un set per eliminare elementi duplicati. Puoi trovare maggiori informazioni sui set qui.

Lascio in fondo al messaggio un’implementazione che fa uso dei set.

Buona fortuna nell’implementazione!

Implementazione della funzione usando i set
def controllino(
    l: list[object] # L contiene elementi di qualsiasi tipo (interi, stringhe, ...)
) -> list[str]: # Viene restituita una lista di stringhe
    n: set[str] = set(map(str, l)) # Convertiamo L in un set, rimuovendo i duplicati
    result: list[str] = list(n) # Copiamo N in una lista
    
    # La tua logica rimane invariata
    for element in n:
        for i in range(len(element) - 1):
            if element[i] == element[i + 1]:
                result.remove(element)
                break
    
    return result

Ovviamente potrebbe essere migliorata ulteriormente :wink:

P.S. ho usato type hints in modo da chiarire meglio il perché di alcune azioni, volendo puoi tranquillamente ometterle:

def controllino(l):
    n = set(map(str, l))
    l = list(n)
    
    for element in n:
        for i in range(len(element) - 1):
            if element[i] == element[i + 1]:
                l.remove(element)
                break
    
    return l
1 Mi Piace