Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

231
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório

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 Relatório

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 Relatório

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 Relatório

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda