Tengo una lista como la siguiente

a = [5,5,5,5,3,3,2,2,2,2,5,5,5,2,2,2,2,2]

Deseo tener la siguiente lista de salida

b = [5,3,2,5,2]

Tenga en cuenta que he intentado usar

list(OrderedDict.fromkeys(a))

Lo que me da

[5, 3, 2]

Tenga en cuenta que no considera el 2do 5 o el 2do 2 ya que no son únicos para entonces.

Necesito una forma de hacer que la máquina entienda que cuando encuentre un elemento único (digamos el primer '5'), debería almacenarlo en la lista b. En consecuencia, cuando encuentra el primer '3' o el primer '2', también debe almacenarlos en la lista b. No hay problemas hasta este punto. A medida que se encuentra con el segundo conjunto de '5', debe almacenar ese 5 como un nuevo elemento en la lista b. Lo mismo ocurre con el segundo conjunto de 2.

¿Hay una manera pitónica de hacer esto?

0
Debjit Bhowmick 1 oct. 2019 a las 11:09

3 respuestas

La mejor respuesta

Además de hacer un bucle for, puede usar itertools groupby:

import itertools

a = [5,5,5,5,3,3,2,2,2,2,5,5,5,2,2,2,2,2]
b = [x[0] for x in itertools.groupby(a)]  # [5, 3, 2, 5, 2]

La documentación para esto se puede encontrar aquí: https: //docs.python. org / 3 / library / itertools.html # itertools.groupby

3
RiceKab 1 oct. 2019 a las 08:16

Puede resolver este problema sin ningún iterador utilizando la lista completa

a = [5,5,5,5,3,3,2,2,2,2,5,5,5,2,2,2,2,2]
b = [a[i] for i in range(len(a)) if a[i]! = a[i-1]]
Print(b)
Output is b = [5,3,2,5,2]
0
Abhishek Kumar 1 oct. 2019 a las 09:03

Si trabaja con matrices numpy, puede usar un filtro simple diff para enmascarar elementos repetidos:

import numpy as np

a = np.array([5,5,5,5,3,3,2,2,2,2,5,5,5,2,2,2,2,2])

mask = np.ones(a.shape).astype(np.bool_)
mask[1:] = np.diff(a).astype(np.bool_) # prepend a 'True', adjust if not 1D

b = a[mask]
# [5 3 2 5 2]
0
MrFuppes 1 oct. 2019 a las 08:31
58180564