CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Python 3.4] Probleme de classe (graphe)

Pierre282
Pierre282
Niveau 6
06 mai 2016 à 21:52:15

:globe: Bonsoir,
Ayant un DM d'info à réaliser sur python, je me suis retrouvé dans l’embarra en découvrant que mon école utilise python 2.7 alors que j'ai installé python 3.4 (et pas trouver de moyen rapide de passer au 2.7). Je n'arrive pas à faire marcher une simple classe qui pourtant fonctionnait correctement sur python 2.7 il me semble:

class Graphe ():

def __init__(self) :
self.graphe={}

def inserSommet(self, s):

if s not in self.graphe.keys():
self.gaphe[s]={}

def inserArete(self, x, y, p):

if x!=y:
self.graphe[x][y]=p
self.graphe[y][x]=p

D'après mes recherches, en passant de la version 2.7 à 3.4 : ".keys()", ".values()" et ".items()" ne rapportent plus des listes et il faut donc passer par "list(graphe.keys())". Néanmoins ça ne passe pas et je ne comprend pas pourquoi, avec ce code :

class Graphe ():

def __init__(self) :
self.graphe={}
def inserSommet(self, s):
if s not in list(self.graphe.keys()):
self.gaphe[s]={}
def inserArete(self, x, y, p):
if x!=y:
self.graphe[x][y]=p
self.graphe[y][x]=p

g=Graphe()

g.inserSommet('A')
g.inserSommet('B')
g.inserArete('A','B',2)
print (g.graphe['A']['B'])
print (g.graphe)

J'obtiens une erreur :

self.gaphe[s]={}

AttributeError: 'Graphe' object has no attribute 'gaphe'

Quelqu'un pourrait m'éclairer sur le sujet ? Sans pouvoir définir de classe je ne peux même pas commencer à travailler sur ce que j'ai à faire (et la en plus ce n'est que le début de la classe) :mort:

Message édité le 06 mai 2016 à 21:53:24 par Pierre282
Grimmys
Grimmys
Niveau 19
06 mai 2016 à 21:58:32

Salut,

C'est tout simple : tu as écris " gaphe " au lieu de " graphe ". :noel:

C'est juste une petite gaffe à la con. :hap:

Et sinon, ça fait longtemps que je n'ai pas retouché à Python, mais il me semble que .items(), .keys() etc fonctionne toujours... :(

Message édité le 06 mai 2016 à 21:59:01 par Grimmys
Pierre282
Pierre282
Niveau 6
06 mai 2016 à 22:10:42

Merci, j'ai perdu beaucoup de temps sur une erreur aussi simple :ouch:

Le 06 mai 2016 à 21:58:32 Grimmys a écrit :
Et sinon, ça fait longtemps que je n'ai pas retouché à Python, mais il me semble que .items(), .keys() etc fonctionne toujours... :(

"Some more commonly used functions and methods that don’t return lists anymore in Python 3:
zip()
map()
filter()
dictionary’s .keys() method
dictionary’s .values() method
dictionary’s .items() method"

Du coup est ce qu'on peut faire :
:d) if s not in self.graphe.keys() si self.graphe.keys() n'est pas une liste
:d) for i sorted(self.graphe.keys()) si self.graphe.keys() n'est pas une liste (pour un autre bout de programme) ?
Je ne suis pas sur mais il me semble devoir passer par list()

Grimmys
Grimmys
Niveau 19
06 mai 2016 à 22:15:05

Oui d'accord, ce ne sont peut-être plus des listes, mais cela reste des séquences que tu peux parcourir, ce sont peut-être des tuples, je ne sais pas...

Du coup la première utilisation doit être possible, la seconde, ça dépend si sorted() fonctionne sur le type de séquence en question.

Je vais faire un tour sur la doc, je suis curieux. :hap:

Grimmys
Grimmys
Niveau 19
06 mai 2016 à 22:22:45

Bon, alors de ce que j'ai trouvé :

- Oui, la fonction sorted() accepte n'importe quelle type de séquence
- Oui, ce que retourne .items(), .keys() etc est une séquence : c'est en fait un " view object " ( donc vue de l'objet, bref, je ne sais pas quel serrait l'équivalent français :( ), c'est en gros une liste, mais qui sera modifiée si tu modifies le dico : c'est dynamique.

Bref, au final : pas besoin de convertir ceci en liste. :)

( la doc dessus : https://docs.python.org/3/library/stdtypes.html#dict-views )

Pierre282
Pierre282
Niveau 6
06 mai 2016 à 22:30:51

class Graphe ():
def __init__(self) :
self.graphe={}
def inserSommet(self, s):
if s not in self.graphe.keys():
self.graphe[s]={}
def inserArete(self, x, y, p):
if x!=y:
self.graphe[x][y]=p
self.graphe[y][x]=p
def afficherListesAdj(self):
for i in sorted(self.graphe.keys())):
print (i,"-->", list(self.graphe[i].keys()))

g=Graphe()
g.inserSommet('A')
g.inserSommet('B')
g.inserSommet('C')
g.inserSommet('D')
g.inserSommet('E')
g.inserSommet('F')
g.inserArete('A','C',2)
g.inserArete('D','B',2)
g.inserArete('B','C',800)
g.inserArete('B','D',7)
g.inserArete('C','D',7)
g.inserArete('F','A',7)
print (g.graphe)
g.afficherListesAdj()

Sortie :

{'D': {'B': 7, 'C': 7}, 'A': {'F': 7, 'C': 2}, 'C': {'D': 7, 'A': 2, 'B': 800}, 'E': {}, 'F': {'A': 7}, 'B': {'D': 7, 'C': 800}}
A --> ['F', 'C']
B --> ['D', 'C']
C --> ['D', 'A', 'B']
D --> ['B', 'C']
E --> []
F --> ['A']

J'ai testé pour la classe si dessus, le list() et PAS nécessaire avant le sorted (comme tu l'as indiqué) et pour afficher, enfin si pour l'affichage puisque sinon en sortie on un truc moins propre :

A --> dict_keys(['F', 'C'])
B --> dict_keys(['D', 'C'])
C --> dict_keys(['D', 'A', 'B'])
D --> dict_keys(['B', 'C'])
E --> dict_keys([])
F --> dict_keys(['A'])

Je ne comprend pas vraiment pourquoi mais ça marche :ok:
Merci pour l'aide en tout cas :oui:

Message édité le 06 mai 2016 à 22:33:22 par Pierre282
Grimmys
Grimmys
Niveau 19
06 mai 2016 à 22:40:15

Bah le " pourquoi " c'est ce que je t'ai expliqué : .keys() ne renvoie pas une liste, donc forcément, quand tu l'affiches, ça n'a pas l'apparence d'une liste. :ok:

Par contre, ben tu peux parcourir .keys() comme une list, donc pas besoin de convertir pour utiliser for i in ... et sorted().

De rien sinon, par contre fais attention à la mise en forme de ton code : les noms de tes fonctions / variables me semblent très peu judicieux. :(
( genre un attribut " graphe " à l'objet " Graphe "... ça ne veut pas dire grand chose... idem pour l'argument " s " => remplace le par " sommet " ).

Pierre282
Pierre282
Niveau 6
06 mai 2016 à 23:34:53

C'est le dict_keys que je comprend pas totalement, pour les listes je savais. Et oui c'est pas super clair :siffle:

Grimmys
Grimmys
Niveau 19
06 mai 2016 à 23:54:40

Ah oui, ben comme je t'ai dit : ce n'est pas une liste.

Donc quand tu demandes d'afficher, bah ça s'affiche pas comme une liste.
Normal, t'en occupes pas, c'est simplement la mise en forme d'un objet de type " View object ". :oui:

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment