Operación entre una lista y todas las demás listas restantes excluyendo la operación entre la lista seleccionada en sí -- python campo con python-3.x camp codereview Relacionados El problema

Operation between one list and all other remaining lists excluding the operation between the selected list itself


-1
vote

problema

Español

Este código está funcionando bien. ¿Hay alguna manera de minimizar la complejidad del código?

  final = [] a = [[10, 20, 30], [40, 50, 60], [70, 80, 90]] for i in range(len(a)):     temp = []     for k in range(len(a)):         m = 0         if i != k:             for j in range(0, len(a)):                 DIFFERENCE = (a[i][j] - a[k][j])**2                 m += DIFFERENCE                 p = (1/(2 * m)) * DIFFERENCE             temp.append(p)     final.append(temp)   
Original en ingles

This code is working well. Is there a way to minimize the complexity of the code?

final = [] a = [[10, 20, 30], [40, 50, 60], [70, 80, 90]] for i in range(len(a)):     temp = []     for k in range(len(a)):         m = 0         if i != k:             for j in range(0, len(a)):                 DIFFERENCE = (a[i][j] - a[k][j])**2                 m += DIFFERENCE                 p = (1/(2 * m)) * DIFFERENCE             temp.append(p)     final.append(temp) 
     
 
 

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Puede usar elif (x + y + z) % 2 == 0: return '0' 1 JUNCIÓN CON elif (x + y + z) % 2 == 0: return '0' 2 Para esto.

primero, elif (x + y + z) % 2 == 0: return '0' 3 Da elif (x + y + z) % 2 == 0: return '0' 4 , es decir, la combinación de cada elemento entre sí, incluido elif (x + y + z) % 2 == 0: return '0' 5 y 99887766555443326 , pero excluyendo la combinación de cada elemento con sí mismo ( por lo que elif (x + y + z) % 2 == 0: return '0' 7 ).

Con esto podemos usar operaciones inteligentes-sabias de elementos simples:

  elif (x + y + z) % 2 == 0:     return '0' 8  

Para el pequeño ejemplo que dio, esto no es realmente más rápido (pero tampoco más lento). También es mucho más legible, imo.

Para una muestra aleatoria de la forma 100 x 100, este código toma alrededor de 33 ms para calcular el resultado final, mientras que la suya toma más de un segundo.


Algunos comentarios en su código explícitamente:

  • Python tiene una guía de estilo oficial, PEP8 , que es Bien vale la pena leer. Se recomienda usar elif (x + y + z) % 2 == 0: return '0' 9 para nombres de variable (y función).
  • En su bucle INNERMOST, calcula print0 cada iteración, pero solo la última iteración contiene el valor que le importa. Por lo tanto, puede sacarlo del bucle.
  • Su código solo funciona para print1 Entradas, mientras que el algoritmo (y mi código) funciona para 99887776655443332 Entradas.
 

You can use numpy in conjunction with itertools for this.

First, itertools.permutations("ABCD", 2) gives AB AC AD BA BC BD CA CB CD DA DB DC, i.e. the combination of each element with each other, including AB and BA, but excluding the combination of each element with itself (so AA).

With this we can use simple numpy element-wise operations:

from itertools import permutations import numpy as np  def graipher(a):     a = np.array(a)  # to make sure, better call this outside and remove it here     final = []     for x, y in permutations(a, 2):         d = (x - y)**2         m = d.sum()         final.append(d[-1] / (2*m))     return np.array(final).reshape(len(a), -1)  if __name__ == "__main__":     a = [[10, 20, 30], [40, 50, 60], [70, 80, 90]]     print(graipher(a).tolist()) # [[0.16666666666666666, 0.16666666666666666], #  [0.16666666666666666, 0.16666666666666666], #  [0.16666666666666666, 0.16666666666666666]] 

For the small example you gave, this is not actually faster (but also not slower). It is also a lot more readable, IMO.

For a random sample of shape 100 x 100, this code takes about 33 ms to compute the final result, whereas yours takes more than a second.


Some comments on your code explicitly:

  • Python has an official style-guide, PEP8, which is well worth a read. It recommends using lower_case for variable (and function) names.
  • In your innermost loop, you calculate p every iteration, but only the last iteration contains the value you care about. You can therefore pull it out of the loop.
  • Your code works only for n x n inputs, whereas the algorithm (and my code) works for n x k inputs.
 
 

Relacionados problema

4  Calculadora binaria de Python  ( Python binary calculator ) 
Mi tarea fue construir una calculadora en la adición binaria de soporte de Python, etc. Para comenzar Definir un par de excepciones personalizadas: paper...

0  Producto cartesiano de dos tuplas - Python  ( Cartesian product of two tuples python ) 
Estoy resolviendo el ejercicio 4 de Discusión 3 de CS 61A (2012) de Berkley (2012) (consulte la página 4): Rellene la definición de cartesian_product . ...

5  Acelera a OpenGL 2D en Python3  ( Accelerate opengl 2d on python3 ) 
Estoy usando OpenGL para dibujar alrededor de 20 círculos. Cada círculo tiene 2 líneas, ~ 10 segmentos, y todos ellos tienen diferentes colores y longitudes. ...

2  Implementación de árboles de búsqueda de ternarios en Python 3  ( Ternary search tree implementation in python 3 ) 
He implementado un árbol de búsqueda ternario. Funciona bien. Pero si crees que algo necesita mejorarse, dígalo. Este código fue probado en Python 3.7.4. c...

2  Algoritmo de libros que se ocupa de sumas de dígitos cuadrados  ( Books algorithm dealing with square digit sums ) 
un pequeño contexto: libro tiene 411 páginas Lea un número aleatorio de páginas en el primer día que es desconocido Número de páginas para leer e...

3  Juego de Hangman escrito en Python 3.5  ( Hangman game written in python 3 5 ) 
Esto recopila las conjeturas del usuario para la palabra. El usuario tiene 8 conjeturas, una conjetura correcta y una suposición repetida no afecta al conteo ...

5  Suma de todos los dígitos en una cadena  ( Sum of all digits in a string ) 
Dada una cadena, devuelva la suma de todos los números en la cadena, 0 si no hay ninguno. A continuación es mi solución para el problema anterior. Siento ...

5  Orden de número más grande en cadena  ( Largest number order in string ) 
Dada una cadena, suponiendo que la cadena sea solo números, reorganice la cadena a la que sea el mayor número posible. a continuación es mi solución al pr...

5  Excel a JSON Parser con http descargar  ( Excel to json parser with http download ) 
He estado trabajando en un proyecto ( enlace ) a Descargue una hoja de cálculo de Ransomware y propiedades conocidas y conviértase en JSON para que pueda cons...

7  Juego de Blackjack hecho en Python 3  ( Blackjack game made in python 3 ) 
Este es un juego de blackjack simple, terminé de hacer con Python. Espero que te guste y estoy abierto a cualquier sugerencia o crítica que me darías. NSUS...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos