Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

229
Vistas
Lista de filtrado de tuplas según la condición

Para una lista dada de tuplas, si varias tuplas en la lista tienen el mismo primer elemento de tupla, entre ellas seleccione solo la tupla con el último elemento máximo.

Por ejemplo:

 sample_list = [(5,16,2),(5,10,3),(5,8,1),(21,24,1)]

En la lista de sample_list anterior, dado que las primeras 3 tuplas tienen el primer elemento 5 similar, en este caso, entre ellas, solo se debe conservar la segunda tupla, ya que tiene el último elemento máximo => 3 .

Operación esperada:

 op = [(5,10,3),(21,24,1)]

Código:

 op = [] for m in range(len(sample_list)): li = [sample_list[m]] for n in range(len(sample_list)): if(sample_list[m][0] == sample_list[n][0] and sample_list[m][2] != sample_list[n][2]): li.append(sample_list[n]) op.append(sorted(li,key=lambda dd:dd[2],reverse=True)[0]) print (list(set(op)))

Esto funciona. Pero es muy lento para una lista larga. ¿Hay una forma más pitónica o eficiente de hacer esto?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Prueba itertools.groupby :

 from itertools import groupby sample_list.sort() print([max(l, key=lambda x: x[-1]) for _, l in groupby(sample_list, key=lambda x: x[0])])

O también con operator.itemgetter :

 from itertools import groupby from operator import itemgetter sample_list.sort() print([max(l, key=itemgetter(-1)) for _, l in groupby(sample_list, key=itemgetter(0))])

Para el rendimiento intente:

 from operator import itemgetter dct = {} for i in sample_list: if i[0] in dct: dct[i[0]].append(i) else: dct[i[0]] = [i] print([max(v, key=itemgetter(-1)) for v in dct.values()])

Toda la salida:

 [(5, 10, 3), (21, 24, 1)]
over 4 years ago · Santiago Trujillo Denunciar

0

Utiliceitertools.groupby y operator.itemgetter para mejorar la legibilidad. Dentro de los grupos, aplique max con una función de tecla apropiada, nuevamente usando itemgetter por brevedad:

 from itertools import groupby from operator import itemgetter as ig lst = [(5, 10, 3), (21, 24, 1), (5, 8, 1), (5, 16, 2)] [max(g, key=ig(-1)) for _, g in groupby(sorted(lst), key=ig(0))] # [(5, 10, 3), (21, 24, 1)]

Para una solución de tiempo lineal, con espacio extra solo limitado por el número de primeros elementos únicos, puede usar un dict :

 d = {} for tpl in lst: first, *_, last = tpl if first not in d or last > d[first][-1]: d[first] = tpl [*d.values()] # [(5, 10, 3), (21, 24, 1)]
over 4 years ago · Santiago Trujillo Denunciar

0

Aquí hay un método de tiempo lineal que creo que califica como más pitónico:

 highest = dict() for a, b, c in sample_list: if a not in highest or c >= highest[a][2]: highest[a] = (a, b, c) op = list(highest.values())

Puede cambiar el >= a > si le importa cómo elegir entre triples con el mismo primer y último elemento pero diferentes elementos intermedios.

Como señaló @AlexWaygood, los dict han generado sus elementos según el orden de inserción desde Python 3.7. Por lo tanto, el código anterior hace que los elementos de op estén en el mismo orden que los elementos de sample_list .

En Python 3.6 o anterior, por otro lado, el orden puede cambiar. Si desea una solución que también funcione en Python 3.6, deberá usar un OrderedDict , como en:

 from collections import OrderedDict highest = OrderedDict() for a, b, c in sample_list: if a not in highest or c >= highest[a][2]: highest[a] = (a, b, c) op = list(highest.values())
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda