Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

236
Views
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 answers
Answer question

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 Report

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 Report

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 Report

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 Report

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 Report

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 Report

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!