2015-08-25 4 views
-1

J'essaie de faire, par exemple;Produit de nombre entier dans la liste sauf l'entier à cet index

liste donnée [1,7,3,4]

sortie sera comme: [84,12,28,21] en calculant [7*3*4, 1*3*4, 1*7*4, 1*7*3].

J'ai essayé un compteur puis l'augmenter '1' à chaque fois, mais cela ne marche pas parce que parfois l'entier est au milieu de la liste. Comment peut-on faire l'algorithme de ce problème?

Répondre

4

Si tous les éléments sont des entiers non nuls, que diriez-vous de prendre le produit du tableau complet, puis de diviser ce produit par chaque élément? Exemple -

>>> lst = [1,7,3,4] 
>>> prod = 1 
>>> for i in l: 
...  prod *= i 
... 
>>> newlst = [prod//i for i in lst] 
>>> newlst 
[84, 12, 28, 21] 

en utilisant // pour la division entière.

Pour le faire en moins grand nombre de lignes (2 lignes, compte non tenu des importations/définitions de liste, etc.) -

>>> from functools import reduce 
>>> from operator import mul 
>>> lst = [1,7,3,4] 

>>> prod = reduce(mul,lst) 
>>> newl = [prod//i for i in lst] 

>>> newl 
[84, 12, 28, 21] 
+4

Bien sûr, cela ne fonctionnera que si tous les éléments ne sont pas nuls –

2

Vous pouvez faire quelque chose comme:

out = [product(n for i, n in enumerate(in_) if i != index) 
     for _, index in enumerate(in_)] 

product traite l'itérable des nombres pour donner le produit total, par exemple

def product(nums): 
    return functools.reduce(operator.mul, nums, 1) 
+1

Il utilise N * (N-1) multiplier les opérations qui est O (N^2), tandis que l'autre approche ne fait que 2N. – smci

+0

@smci vous avez raison, même si cette approche est relativement inefficace. – jonrsharpe

0

Ma technique est similaire à Anand S Kumar (mais j'ai écrit quand il n'y avait que 1 autre réponse ici :)). Multiplier tous les éléments & puis diviser par chaque élément pour créer la liste de sortie est beaucoup plus efficace que d'effectuer n-1 multiplications pour chacun des n éléments, en particulier lorsque n est grand.

from operator import mul 
from functools import reduce 

def lagrange(seq): 
    #Find the product of all elements 
    prod = reduce(mul, seq, 1) 
    return [prod // i for i in seq] 

a = [1, 7, 3, 4] 
print a, lagrange(a) 

a = [1, 2, 3, 4, 5, 6] 
print a, lagrange(a) 

sortie

[1, 7, 3, 4] [84, 12, 28, 21] 
[1, 2, 3, 4, 5, 6] [720, 360, 240, 180, 144, 120] 

En Python 2 reduce() est intégré, mais vous pouvez l'importer à partir functools; dans Python 3, il n'est disponible que si vous l'importez à partir de functools. FWIW, j'ai appelé la fonction lagrange parce que le processus m'a rappelé Lagrange polynomial interpolation.

+0

@AnandSKumar: Merci pour la correction du nom du module! Je n'ai pas réalisé que 'reduce()' était disponible en tant qu'importation dans Python 2. –

0
from functools import reduce 
import itertools 
import operator 

a = [1,7,3,4] 

[reduce(operator.mul, i, 1) for i in itertools.combinations(a, len(a) - 1)][::-1]