Python | Reducir la lista dada para elementos repetidos

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))
Producción:

[(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))
Producción:

[(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))
Producción:

[(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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *