Dada una lista de elementos repetitivos, escriba un programa de Python para reducir la repetición de los elementos y convertir la repetición en un elemento de tupla de la lista que contiene el elemento repetido y la cantidad de veces que se ha repetido, por lo tanto, convertir la lista dada en una lista de tuplas.
Ejemplos:
Input : [1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 4] Output : [(1, 3), (2, 1), (3, 3), (4, 4)] Input : ['alice', 'alice', 'bob'] Output : [('alice', 2), ('bob', 1)]
Enfoque #1: Fuerza bruta
Este es un enfoque ingenuo para reducir la lista. Toma otra lista, digamos, ‘tup_list’. Inicialice el índice en 0 y use un bucle para verificar cuántas veces se repite cada elemento único de la lista. Una vez encontrado el elemento y su número de repeticiones, añádalo a la lista en forma de tupla.
# Python3 program to Shrink list # for repeating elements def shrinkList(lst): tup_list = [] i, index = 0, 0 while(index < len(lst)): element_count = 0 while(i < len(lst) and lst[i] == lst[index]): element_count += 1 i += 1 tup_list.append((lst[index], element_count)) index += element_count return tup_list # Driver Code lst = [1, 1, 1, 2, 2, 3, 3, 4] print(shrinkList(lst))
[(1, 3), (2, 2), (3, 2), (4, 1)]
Enfoque n.º 2: Fuerza bruta alternativa
Este es otro enfoque de fuerza bruta que utiliza el bucle for para recorrer la lista. Utiliza una variable ‘prev_element’ para almacenar el elemento anterior. Primero, verifica si este es el primer elemento único o no, si es así, incrementa el contador y almacena el elemento en prev_element. Si el elemento se repite, simplemente incremente el contador. Si todos estos casos no son ciertos, simplemente agregue el prev_element y cuente como tupla a tup_list.
# Python3 program to Shrink list # for repeating elements def shrinkList(lst): prev_element = None count = 0 tup_list = [] for ele in lst: if (prev_element == ele): count += 1 elif (prev_element is None): count += 1 prev_element = ele else: tup_list.append((prev_element, count)) count = 1 prev_element = ele tup_list.append((prev_element, count)) return tup_list # Driver Code lst = [1, 1, 1, 2, 2, 3, 3, 4] print(shrinkList(lst))
[(1, 3), (2, 2), (3, 2), (4, 1)]
Enfoque #3: Uso de Itertools.groupby()
Este es un enfoque más pythonico para resolver el problema dado. El itertools.groupby()
hacer un iterador que devuelve claves y grupos consecutivos del iterable. Agrupa elementos similares y devuelve los elementos y su recuento como lista de tuplas.
# Python3 program to Shrink list # for repeating elements from itertools import groupby def shrinkList(lst): return ([(element, len(list(i))) for element, i in groupby(lst)]) # Driver Code lst = [1, 1, 1, 2, 2, 3, 3, 4] print(shrinkList(lst))
[(1, 3), (2, 2), (3, 2), (4, 1)]
Publicación traducida automáticamente
Artículo escrito por Smitha Dinesh Semwal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA