2017-04-14 2 views
-1

I généré combinaison de chiffres, par exemple 123, en utilisant ce codecombinaisons Génération avec repetetions en python

from itertools import combinations 
for i in set(combinations('123',2)): 
    print(''.join(i)) 

-je obtenir la sortie désirée ici

13 
12 
23 

Mais quand je l'utilise 133, je reçois

13 
33 

Mais je veux ignorer la répétition, Je veux la sortie comme

13 
13 
33 

Existe-t-il une autre approche?

+6

Supprimez l'appel 'set'. C'est ce qui réduit '13 13 33' à' 13 33' –

+1

Eh bien, n'appelez pas 'set()'? Je ne vois pas pourquoi vous devez appeler 'set()'. – kennytm

+1

Pourquoi utilisez-vous 'set' si vous ne voulez pas supprimer la répétition? –

Répondre

1

set() s par nature, ne permettent pas d'éléments en double. Chaque élément d'unset()doit être unique. La documentation Python prend note de ceci:

Python inclut également un type de données pour les ensembles. Un ensemble est une collection non ordonnée sans éléments en double.

Emphasis mine. C'est pourquoi vous n'obtenez pas votre sortie attendue. Lorsque vous appelez set(), il supprime le doublon 13 de vos combinaisons. Au lieu de cela, juste itérer l'objet combinaison est:

from itertools import combinations 

for i in combinations('133', 2): # no call to set() 
    print(''.join(i)) 

qui délivre en sortie:

13 
13 
33 
1

C'est très simple. Vous devez utiliser list (combinaisons ('123', 2)) et non défini. L'ensemble réduit les valeurs identiques.

+2

Ou simplement * non * 'list (..)', 'tuple (..)', ... du tout. –

+0

Vous avez raison. Il peut simplement retirer l'ensemble, la boucle for va itérer correctement. – Erez

+0

Il n'y a pas besoin ** d'appeler 'list()'. En fait, vous voulez éviter cela si tout ce que vous faites est en boucle. –