Problème interactive input

Résolu
loulou -  
 loulou -

Bonjour,

Je débute sur python et j'ai trouvé un  programme sur internet permettant de faire ce que je veux, le voici:

def combinlisterep(seq, k):
    """Renvoie la liste des combinaisons avec répétition des objets de seq pris k à k"""
    # ajoute chaque objet de seq pour quils apparaissent chacun k fois
    seq2 = []
    for elem in seq:
        if elem not in seq2:
            for i in xrange(0,k):
                seq2.append(elem)
    # calcule la liste "normale" des combinaisons
    p = combinliste(seq2, k)
    # élimine de cette liste les éléments identiques (comme [1,2] et [1,2])
    p2 = []
    for x in p:
        if x not in p2:
            p2.append(x)
    # et renvoie le résultat
    return p2

dans la console je marque : 

print combinlisterep([1,2,3],2)

et il y a ecrit :

File "<interactive input>", line 1
    print combinlisterep([1,2,3],2)
                       ^
SyntaxError: invalid syntax

pouvait vous m'aider à résoudre ce problème? Merci


Windows / Chrome 108.0.0.0

7 réponses

Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 

Bonjour,

Tu veux dire que tu as:

d'un coté un fichier qui contient le code

et d'un autre, tu tapes ta commande dans la console ??

0
jee pee Messages postés 41520 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 

Bonjour,

Dans les dernières versions de Python c'est

 print(combinlisterep([1,2,3],2))

 la fonction n'est pas définie

p = combinliste(seq2, k)


xrange() est-ce une fonction standard ?


0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 

xrange retourne un générateur, et donc occupe moins de place en mémoire que range

0
loulou
 

Merci de vos réponses, j'utilise édupython j'écris le script en haut et je tappe 

print combinlisterep([1,2,3],2)

dans la console.

J'ai donc essayé aussi avec 

print(combinlisterep([1,2,3],2))

mais de nouveau un message d'erreur s'affiche:

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Users\Jolan\Desktop\Lycée\Python\combinatoire.py", line 7, in combinlisterep
    for i in xrange(0,k):
NameError: name 'xrange' is not defined

et je ne comprends pas le fait que la fonction n'est pas définie j'ai bien recopier ce que vous avez écrit.

0
blobu
 

Salut,  le code que tu as copié est un vieux code créé avec python2, pour que ce soit valide en python3, il faut donc modifier tous les prints (ajouter des parenthèses comme tu as fait), ainsi que remplacer les xrange par range (supprimer le x).

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
blobu
 

Ce code a l'air simplement de générer des combinaisons de X valeurs parmi une séquence, code fait en 2010, il existe le module itertools fournissant un tas de fonctions bien utiles.

https://docs.python.org/fr/3/library/itertools.html#itertools.combinations

0
loulou
 

voici à quoi ressemble le code maintenant 

def combinlisterep(seq, k):
    seq2 = []
    for elem in seq:
        if elem not in seq2:
            for i in range(0,k):
                seq2.append(elem)
    p = combinliste(seq2, k)
    p2 = []
    for x in p:
        if x not in p2:
            p2.append(x)
    return(p2)

j'ai donc mit des paranthèses et enlevé le x. Dois-je aussi enlever le x de 

for x in p:
        if x not in p2:
            p2.append(x)

et mettre des i ?

le meme message d'erreur s'affiche que précédemment.

0
blobu
 

Non, il ne faut pas modifier les noms de variables, aucune nécessité.

Cette fonction est correcte et devrait retourner le résultat escompté.

Je suppose que tu as extrait cette fonction de https://python.jpvweb.com/python/mesrecettespython/doku.php?id=combinaisons

def combinlisterep(seq, k):
    seq2 = []
    for elem in seq:
        if elem not in seq2:
            for i in range(0,k):
                seq2.append(elem)
    p = combinliste(seq2, k)
    p2 = []
    for x in p:
        if x not in p2:
            p2.append(x)
    return(p2)


def combinliste(seq, k):
    p = []
    i, imax = 0, 2**len(seq)-1
    while i<=imax:
        s = []
        j, jmax = 0, len(seq)-1
        while j<=jmax:
            if (i>>j)&1==1:
                s.append(seq[j])
            j += 1
        if len(s)==k:
            p.append(s)
        i += 1
    return p


print(combinlisterep('12345', 4))

Mais c'est déjà très lent pour de si simples combinaisons.

Utilise plutôt la fonction du module itertools faisant exactement la même chose.

import itertools

print(tuple(itertools.combinations_with_replacement('12345', 4)))
0
loulou
 

Ah be ok  c'est génial j'ai testé merci beaucoup alors. Bonne soirée!

0