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

230
Vistas
Cómo obtener de manera eficiente la media de los elementos en dos listas de listas en Python

Tengo dos listas de la siguiente manera.

 mylist1 = [["lemon", 0.1], ["egg", 0.1], ["muffin", 0.3], ["chocolate", 0.5]] mylist2 = [["chocolate", 0.5], ["milk", 0.2], ["carrot", 0.8], ["egg", 0.8]]

Quiero obtener la media de los elementos comunes en las dos listas de la siguiente manera.

 myoutput = [["chocolate", 0.5], ["egg", 0.45]]

Mi código actual es el siguiente

 for item1 in mylist1: for item2 in mylist2: if item1[0] == item2[0]: print(np.mean([item1[1], item2[1]]))

Sin embargo, dado que hay dos bucles for (complejidad O(n^2) ), esto es muy ineficiente para listas muy largas. Me pregunto si hay una forma más estándar/eficiente de hacer esto en Python.

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

0

Aquí hay una solución simple, muy pitónica:

result = [[x[0], (x[1] + y[1])/2] for x in mylist1 for y in mylist2 if x[0] == y[0]]

Probablemente no sea la solución más rápida, pero es más rápida en virtud del uso de la comprensión de listas de Python para iterar las listas y, dado que ni esta solución ni los OP funcionarán con múltiples instancias de un valor clave de lista, reemplaza el np.mean con un promedio simple de los dos valores.

over 4 years ago · Santiago Trujillo Denunciar

0

Puede hacerlo en O (n) (una sola pasada sobre cada lista) convirtiendo 1 en un dictado, luego, por elemento en la segunda lista, acceda a ese dictado (en O (1)), así:

 mylist1 = [["lemon", 0.1], ["egg", 0.1], ["muffin", 0.3], ["chocolate", 0.5]] mylist2 = [["chocolate", 0.5], ["milk", 0.2], ["carrot", 0.8], ["egg", 0.8]] l1_as_dict = dict(mylist1) myoutput = [] for item,price2 in mylist2: if item in l1_as_dict: price1 = l1_as_dict[item] myoutput.append([item, (price1+price2)/2]) print(myoutput)

Producción:

 [['chocolate', 0.5], ['egg', 0.45]]
over 4 years ago · Santiago Trujillo Denunciar

0

Para manipular fácilmente sus valores, sugeriría usar un dict , encontrar las claves comunes y calcular la media:

 mylist1 = [["lemon", 0.1], ["egg", 0.1], ["muffin", 0.3], ["chocolate", 0.5]] mylist2 = [["chocolate", 0.5], ["milk", 0.2], ["carrot", 0.8], ["egg", 0.8]] recipe_1 = dict(mylist1) # {'lemon': 0.1, 'egg': 0.1, 'muffin': 0.3, 'chocolate': 0.5} recipe_2 = dict(mylist2) # {'chocolate': 0.5, 'milk': 0.2, 'carrot': 0.8, 'egg': 0.8} common_keys = recipe_1.keys() & recipe_2.keys() # {'chocolate', 'egg'} myoutput = [[item, np.mean((recipe_1[item], recipe_2[item]))] for item in common_keys] myoutput = [[item, (recipe_1[item] + recipe_2[item]) / 2] for item in common_keys]
over 4 years ago · Santiago Trujillo Denunciar

0

Una solución O(n) que promediará todos los elementos.
Construya un diccionario con una lista de los valores y luego promedie ese diccionario:

 In []: d = {} for lst in (mylist1, mylist2): for i, v in lst: d.setdefault(i, []).append(v) # alternative use collections.defaultdict [(k, sum(v)/len(v)) for k, v in d.items()] Out[]: [('lemon', 0.1), ('egg', 0.45), ('muffin', 0.3), ('chocolate', 0.5), ('milk', 0.2), ('carrot', 0.8)]

Luego, si solo quieres los comunes, puedes agregar un guardia:

 In []: [(k, sum(v)/len(v)) for k, v in d.items() if len(v) > 1] Out[]: [('egg', 0.45), ('chocolate', 0.5)]

Esto se extiende a cualquier número de listas y no hace ninguna suposición sobre el número de elementos comunes.

over 4 years ago · Santiago Trujillo Denunciar

0

Convertir listas en dictados

 d_list1 = dict(mylist1) d_list2 = dict(mylist2) [[k, (v+d_list2[k])/2] for k, v in d_list1.items() if k in d_list2] #[['egg', 0.45], ['chocolate', 0.5]]
over 4 years ago · Santiago Trujillo Denunciar

0

Obtiene las claves comunes de las dos listas usando el método de intersection de set y luego usando una comprensión de lista, calcule la media:

 mylist1 = [["lemon", 0.1], ["egg", 0.1], ["muffin", 0.3], ["chocolate", 0.5]] mylist2 = [["chocolate", 0.5], ["milk", 0.2], ["carrot", 0.8], ["egg", 0.8]] dict1 = dict(mylist1) dict2 = dict(mylist2) res = [[key, (dict1.get(key)+dict2.get(key))/2] for key in set(dict1.keys()).intersection(set(dict2.keys()))] print(res)

Producción:

 >> [['chocolate', 0.5], ['egg', 0.45]]
over 4 years ago · Santiago Trujillo Denunciar

0

Puede hacerlo en el tiempo requerido para computar las intersecciones del conjunto, que aparentemente es O (min (N1, N2)) donde N1, N2 son las longitudes de la lista.

 intersect = set([a[0] for a in mylist1]).intersection([a[0] for a in mylist2]) d1=dict(mylist1) d2=dict(mylist2) {i:(d1[i]+d2[i])/2 for i in intersect}
over 4 years ago · Santiago Trujillo Denunciar

0

Puede usar la biblioteca Pandas para evitar escribir cualquier tipo de bucle usted mismo.

Su código sería realmente conciso y limpio.

Instale pandas como: pip install pandas .

Entonces prueba esto:

 In [132]: import pandas as pd In [109]: df1 = pd.DataFrame(mylist1) In [110]: df2 = pd.DataFrame(mylist2) In [117]: res = pd.merge(df1, df2, on=0) In [121]: res['mean'] = res.mean(axis=1) In [125]: res.drop(['1_x', '1_y'], 1, inplace=True) In [131]: res.values.tolist() Out[131]: [['egg', 0.45], ['chocolate', 0.5]]

Editar

Pandas es increíblemente rápido porque usa numpy debajo del capó. Numpy implementa operaciones de matriz altamente eficientes.

Consulte la publicación: ¿Por qué los pandas son tan increíblemente rápidos? para obtener más detalles sobre el cálculo de mean a través pure Python vs Pandas .

over 4 years ago · Santiago Trujillo Denunciar

0

Aquí hay una solución que usa collections.defaultdict para agrupar los elementos y calcula los promedios con statistics.mean :

 from collections import defaultdict from statistics import mean mylist1 = [["lemon", 0.1], ["egg", 0.1], ["muffin", 0.3], ["chocolate", 0.5]] mylist2 = [["chocolate", 0.5], ["milk", 0.2], ["carrot", 0.8], ["egg", 0.8]] d = defaultdict(list) for lst in (mylist1, mylist2): for k, v in lst: d[k].append(v) result = [[k, mean(v)] for k, v in d.items()] print(result) # [['lemon', 0.1], ['egg', 0.45], ['muffin', 0.3], ['chocolate', 0.5], ['milk', 0.2], ['carrot', 0.8]]

Si solo queremos claves comunes, solo verifique si los valores son más de 1:

 result = [[k, mean(v)] for k, v in d.items() if len(v) > 1] print(result) # [['egg', 0.45], ['chocolate', 0.5]]

También podríamos construir el resultado a partir de la intersección de conjuntos:

 mylist1 = [["lemon", 0.1], ["egg", 0.1], ["muffin", 0.3], ["chocolate", 0.5]] mylist2 = [["chocolate", 0.5], ["milk", 0.2], ["carrot", 0.8], ["egg", 0.8]] d1, d2 = dict(mylist1), dict(mylist2) result = [[k, (d1[k] + d2[k]) / 2] for k in d1.keys() & d2.keys()] print(result) # [['egg', 0.45], ['chocolate', 0.5]]
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