Problème interactive input

Résolu/Fermé
loulou - 22 déc. 2022 à 13:48
 loulou - 23 déc. 2022 à 17:46

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 lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
22 déc. 2022 à 17:17

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 40431 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 7 novembre 2024 9 417
Modifié le 22 déc. 2022 à 17:27

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 lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
22 déc. 2022 à 17:45

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

0

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

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

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

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

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

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

0