9
votes

Multipliez tous les éléments d'une liste ensemble (un autre index de la liste hors de portée)

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


2 commentaires

Jetez un coup d'œil à itertools.Product


Je pense que itTools.combinations est plus comme ce que son exemple montre.


4 Réponses :


4
votes
[2, 3, 4, 6, 8, 12]

0 commentaires

24
votes
from itertools import combinations

xs = [1, 2, 3]
products = [x1 * x2 for x1, x2 in combinations(xs, 2)]

0 commentaires

1
votes
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

5 commentaires

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 .


double comptage


Vrai, c'est pourquoi combinaisons est absolument la meilleure réponse. ;RÉ



1
votes

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:
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 à xxx

Cependant, une meilleure méthode de boucle à travers la liste comme celle-ci est d'utiliser énumérer: xxx


0 commentaires