Dans un programme J'écris, j'ai besoin de multiplier chaque élément d'une liste avec tous les autres éléments, comme celui-ci:
def function():
for j in range(len(list)):
n = j+1
for i in range(len(list)):
if n+i > len(list):
n -= 1
x = factor[j] * factor[j+i]
result.append(x)
return
4 Réponses :
[2, 3, 4, 6, 8, 12]
from itertools import combinations xs = [1, 2, 3] products = [x1 * x2 for x1, x2 in combinations(xs, 2)]
In [22]: list1 = range(1000)
In [23]: timeit [x1 * x2 for x1, x2 in combinations(list1, 2)]
10 loops, best of 3: 52.8 ms per loop
In [24]: timeit [v1 * list1[j] for i, v1 in enumerate(list1) for j in xrange(i)]
10 loops, best of 3: 55.7 ms per loop
In [25]: def slow_answer(input_list):
result_list = []
for i in range(len(input_list)):
for j in range(i + 1, len(input_list)):
result_list.append(input_list[i] * input_list[j])
return result_list
....:
In [26]: timeit slow_answer(list1)
10 loops, best of 3: 95 ms per loop
S'il vous plaît ne faites pas cela. Les utilitaires d'itération incroyables de Python sont l'une des choses qui le rend si génial. Itération des indices est un pas clair en arrière. Cela conduit à plus d'encombrement et moins de lisibilité, et il n'est pratiquement jamais nécessaire.
Léger changement stylistique confirmé, mais le deuxième xrange est plus difficile à enlever
Essayez pour i in list1 for j in list1 code>.
double comptage
Vrai, c'est pourquoi combinaisons code> est absolument la meilleure réponse. ;RÉ
Comme le dit FMC, ITERTOOLS est la solution la plus simple. Cependant, il peut être utile de regarder ce qui ne va pas avec le code que vous avez donné, au lieu de simplement écrire un nouveau code complètement. Il y a trois problèmes: Cependant, une meilleure méthode de boucle à travers la liste comme celle-ci est d'utiliser énumérer: p>
1. Vous utilisez deux noms différents pour votre liste (liste et facteur).
2. Vous incluez des produits du facteur de formulaire [J] * facteur [J] quand je suis 0.
3. Qu'est-ce que vous faites lorsque i + n est hors de portée ne fonctionne pas - cela pourrait toujours entraîner quelque chose de gamme.
Une solution possible à 3 est de simplement sortir de la boucle intérieure à ce stade: si vous êtes hors de portée, vous ne voulez rien faire pour cela, je ou pour plus de moi avec le même j. Donc, cela donnerait à
Jetez un coup d'œil à itertools.Product
Je pense que
itTools.combinations code> est plus comme ce que son exemple montre.