He estado trabajando en algunos guiones rápidos y sucios para hacer algunos de mis deberes de química, y uno de ellos repite en listas de una longitud constante donde todos los elementos se suman a una constante dada. Para cada uno, verifico si cumplen con algunos criterios adicionales y los inserto en otra lista.Creando una matriz de números que suman un número dado
me di cuenta de una manera de cumplir con los criterios de suma, pero parece horrendo, y estoy seguro de que hay algún tipo de momento de aprendizaje aquí:
# iterate through all 11-element lists where the elements sum to 8.
for a in range(8+1):
for b in range(8-a+1):
for c in range(8-a-b+1):
for d in range(8-a-b-c+1):
for e in range(8-a-b-c-d+1):
for f in range(8-a-b-c-d-e+1):
for g in range(8-a-b-c-d-e-f+1):
for h in range(8-a-b-c-d-e-f-g+1):
for i in range(8-a-b-c-d-e-f-g-h+1):
for j in range(8-a-b-c-d-e-f-g-h-i+1):
k = 8-(a+b+c+d+e+f+g+h+i+j)
x = [a,b,c,d,e,f,g,h,i,j,k]
# see if x works for what I want
'[Vals Vals en itertools.product (rango (8), repita = 11) si suma (Vals) == 8]' es más bello, pero ** ** mucho más lento que su solución. – eumiro
+1 - Apoyos para usar una computadora para automatizar sus tareas repetitivas de química. –
Mi idea es la siguiente: para una lista de 11 enteros, todos sumando 8, MUCHOS de los números van a ser cero. Una manera rápida de hacer esto sería encontrar todas las formas de sumar enteros a 8 - por ejemplo '8, 1 + 7, 2 + 6, 3 + 5, 4 + 4, 1 + 1 + 6, 1 + 2 + 5 ... 'y luego permute aquellos con el número apropiado de ceros. –