Liste chaînée

YJD_Nado Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

Je suis un élève en classe de terminal et j'ai récemment appris les listes chaîné cependant je bute a l'exercice 3 est ce que vous pouvez m'aider s'il vous plaît ?

Consigne:

Écrire une fonction elements_liste(liste) qui retourne un tableau contenant les éléments de la liste. On pourra utiliser la méthode append et une boucle while. Inutile de rappeler l’importance de spécifier !

Exemple :

>>> elements_liste(mes_invites)
['Inaya', 'Nour', 'Alice']

... et voilà ce que j'ai fait mais ça ne retourne pas le résultat demandé (['Inaya', 'Nour', 'Alice']). Aidez-moi s'il vous plaît.

def creer_liste():
    """retourne une liste vide"""
    return () 

def est_liste_vide(liste):
    """retourne Vrai si la liste est vide"""
    return liste == () 

def inserer(liste, element):
    """insère element en tête de liste et retourne la nouvelle liste"""
    return(element, liste)

def tete(liste):
    """retourne l'élément en tête de liste """
    dernier_element, liste_avant = liste
    return dernier_element

def queue(liste):
    """retourne la liste privée de son premier élément """
    dernier_element, liste_avant = liste
    return liste_avant

def elements_liste(mes_invites):
    """retourne un tableau contenant les éléments de la liste"""
    while dernier_element in liste_avant:
        mes_invites.append(liste_avant)
    
    return [liste_avant]
    
liste_vide = creer_liste()
mes_invites = elements_liste(mes_invites)
est_liste_vide(liste_vide)
liste_2 = inserer(mes_invites, "Alice")
liste_2 = inserer(liste_2, "Nour")
liste_2 = inserer(liste_2, "Inaya")
liste_2 = inserer(liste_2, None)
dernier_element = tete(liste_2)
liste_avant = queue(liste_2)
liste_tableau = elements_liste(mes_invites)

print(mes_invites)


Windows / Chrome 104.0.0.0

A voir également:

3 réponses

cpamafote
 

Bonsoir, tout cela n'a aucun sens. Enfin je ne comprends pas le but de l'exercice.

Pourquoi une fonction pour créer une liste ? Est-ce une obligation de ton enseignant ? (si oui, hum...). En plus tu ne crées pas une liste mais un tuple dans cette fonction creer_liste, un tuple est une liste non mutable, donc user de tuple ne va pas, également, dans l'appel de cette fonction, tu n'en utilises pas le retour (liste_vide).

Que sont censées faire ces lignes dans ton code ?

dernier_element, liste_avant = liste

Si on tente de faire cela, on obtient forcément une erreur :

>>> a = [1, 2, 3]
>>> b, c = a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)

Logique, puisque python ne peut savoir combien d'éléments on veut dans b et c, cela ne fonctionnera uniquement que s'il y a autant de variables que d'éléments dans la liste. Je suppose que ton enseignant a abordé les indices et slices d'itérables afin d'accéder à tel ou tels éléments de la liste. Ici tu en auras besoin.

La fonction elements_liste, idem, je n'en comprends pas l'utilité, puisqu'elle reçoit une liste, construit une liste et retourne cette nouvelle liste, en gros, elle fait une copie de la liste d'origine.

La fonction est_liste_vide, celle-là au moins peut avoir une petite utilité, même chose que précédemment concernant tuple et list. Pour savoir si une liste est vide, on préférera au mieux regarder combien d'éléments contient cette liste:

len(liste) == 0

Et encore bien mieux on utilisera le mot clé not, car, une liste vide est évaluée à False par python, ce qui fait qu'on arrive alors à

def est_liste_vide(liste):
    """retourne Vrai si la liste est vide"""
    return not liste

La fonction inserer, alors celle-là hormis que tu utilises encore des tuples n'est pas très logique puisque tu insères dans ta nouvelle liste, certes un élément nouveau, mais aussi l'ancienne liste, donc on va obtenir des choses comme ['a', ['b', ['c', 'd']]].

Dans cette fonction, tu dois d'abord créer une nouvelle liste, insérer le nouvel élément, puis parcourir les éléments de l'ancienne liste (boucle for), les insérer dans la nouvelle liste, et enfin la retourner.

La fonction tete doit retourner le 1er élément de la liste, ici encore nécessité d'user d'indice.

La fonction queue hormis qu'elle est en incohérence au regard de ce que fait la fonction tete, devrait construire une nouvelle liste en omettant d'y insérer le 1er élément, donc un petit for ... range pourrait convenir.

Bon courage.

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

Bonjour,

Je me demande quel est l'intérêt des listes chainées en Python ..

En C, ok, avec structures et pointeurs, mais en Python, avec toutes les possibilités du langage ...

0
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 

Bonjour,

Comme le soulignent Phil et cpamafote, l'exercice est un peu idiot car les listes existent déjà nativement en python. Je passe aussi sur le fait que l'énoncé est mal rédigé (c'est à peine français).

Enfin, il n'est pas très clair si l'exercice appelle tableau les listes ou les tuples de pythons. Est-ce que la question c'est comment convertir un tuple en liste ? Si oui ça s'écrit comme ça :

t = (1, 2, 3)
l = [x for x in t]

print(t, type(t))  #(1, 2, 3) <class 'tuple'>
print(l, type(l))  #[1, 2, 3] <class 'list'>

Ceci dit, même si l'exercice est idiot, tu peux imiter une structure de liste chaînée en python, c'est à dire avoir une classe qui permet de stocker un maillon de la liste, et une classe qui permet d'envelopper le tout. Il faudrait demander à ton enseignant si c'est ce qu'il attend.

class Maillon:
    def __init__(self, value, next=None):
        self.value = value
        self.next = next

class Liste:
    def __init__(self, iter=None):
        self.head = None
        self.tail = None
        self.cur = None
        if iter is not None:
            for x in iter:
                self.append(x)

    def append(self, value):
        maillon = Maillon(value)
        if self.tail is None:
            self.head = self.tail = maillon
        else:
            self.tail.next = maillon
            self.tail = maillon

    def __iter__(self):
         self.cur = self.head
         return self
 
    def __next__(self):
         if self.cur is None:
             raise StopIteration
         ret = self.cur.value
         self.cur = self.cur.next
         return ret

    def __str__(self):
        return f"Liste<{[x for x in self]}>"

l = Liste()
for x in range(5):    # x itère de 0 à 4
    l.append(x)
print(l)              # Liste<[0, 1, 2, 3, 4]>
print([x for x in l]) # [0, 1, 2, 3, 4]

Ce qui est sûr c'est que le code que tu proposes ne réalise pas une liste chaînée au sens où on l'entend habituellement (contrairement à l'extrait de code ci-dessus).

Bonne chance

0