IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Probleme de TypeError: <lambda>() missing 1 required positional argument: 'b' [Python 3.X]


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Points : 40
    Points
    40
    Par défaut Probleme de TypeError: <lambda>() missing 1 required positional argument: 'b'
    Bonjour,

    J'ai récupéré un code python pour un algo de la fourmi (problème du voyageur de commerce) et j'ai un problème sur une commande sort.
    J'ai la méthode selection dans une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	def selection(self , N=-1):
    		if N == -1 : N = len(self.individus)
    		for v in self.individus:
    			v.evalutation(self.individus,self.distances)
    		self.individus.sort(key=lambda a,b: a.valeur_individu - b.valeur_individu)
    		if N <= len(self.individus) : self.individus = self.individus[0:N]
    Sur la ligne self.individus.sort, j'ai le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.individus.sort(key=lambda a,b: a.valeur_individu - b.valeur_individu)
    TypeError: <lambda>() missing 1 required positional argument: 'b'
    Heu .... une idée sur la cause et bien sûr quelle correction apportée ....
    Merci de votre bon coeur....

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    key dans sort ne concerne qu'un seul élément de la liste: b est donc en trop.

    Si on veut introduire une fonction de comparaison entre 2 éléments, ça dépend de la version de Python:
    - avec Python 2, on a une option "cmp"
    - avec Python 3, l'option "cmp" n'existe plus, mais on peut encore la simuler avec cmp_to_key du module functools
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Bonjour,

    Faudrait voir la tronche de self.individus, si tu peux nous faire un print pour qu'on voit ça, se sera plus simple...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Merci de vos réponses.
    Je pensais qu'il s'agissait d'une erreur de syntaxe donc présenter juste le bout de code serait suffisant et ce qui permettait de ne pas polluer le forum avec un post trop long ..... mais à priori, non, c'est plus complexe.
    Pourquoi c'est tjr pareil avec mes soucis .... Je crois que la solution est simple mais non...
    tyrtamos, merci de tes remarques mais ..... je comprends pas (que dalle pour être plus claire.....).

    Le contexte, j'ai un prog dans lequel j'ai besoin de connaitre la distance entre différents points. L'algo des fourmis me semble approprié. Je cherche donc comme faire cela mais ce n'est pas évident. Dans la mesure où mon problème n'est pas de réaliser un algo des fourmis mais de l'utiliser juste pour un point particulier, j'ai recherché un code tout fait.
    J'ai trouvé un code, et dans les commentaires, quelqu'un a fait pas mal de corrections que j'ai reprises mais cela bloque sur le sort.
    Je dois résoudre ce problème pour voir si les résultats me conviennent.
    Le code dans sa globalité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    #!/usr/bin/env python
    # *-* coding: utf8 *-*
     
    # Trouver la distance minimale pour passer par toutes les villes sachant les distances entre chaque ville
     
    import random,sys,os,time
     
    class individu:
    	def __init__(self,nombre_genes,random=-1):
    		self.genes = []
    		self.nombre_genes = nombre_genes
    		if random == -1 : self.random()
     
    	# random : initialise aleatoirement les genes
    	def random(self):
    		self.genes = []
    		f = list(range(0,self.nombre_genes))
    		for v in range(self.nombre_genes):
    			val = random.choice(f)
    			f.remove(val)
    			self.genes.append(val)
     
    	# evaluation : compare l'individu avec un tableau d'autres individus
    	# retourne le nombre d'individus auquel l'individu self est superieur et de meilleure
    	# qualité
    	def evalutation(self,autres_individus,distances):
    		valeur_individu = 0
    		for v in autres_individus:
    			if self.compare(v,distances) > 0 : valeur_individu = valeur_individu + 1
    		self.valeur_individu = valeur_individu
    		return valeur_individu
     
    	# compare : compare l'individu self avec un autre individu
    	# retourne un nombre positif s'il est superieur
    	# un nombre negatif s'il est inferieur
    	# le nombre 0 s'il est égal
    	def calcul_distance(self,distance):
    		a = self.genes[0]
    		dist = 0
    		for b in self.genes[1:]:
    			min=0
    			max=0
    			if a > b :
    				min = b
    				max = a
    			else :
    				min = a
    				max = b
    			dist = dist + (distance[min])[max-min-1]
    			a = b
    		self.distance = dist
    		return dist
     
    	def compare(self,individu,distance):
    		individu.calcul_distance(distance)
    		self.calcul_distance(distance)
    #		print('individu=',individu)
    #		print('distance=',distance)
    #		print('Diff=',self.distance - individu.distance)
    		return self.distance - individu.distance
     
     
    class population:
    	def __init__(self,nombre_genes,nombre_initial_population=50):
    		self.nombre_genes = nombre_genes
    		self.distances = [[]] * nombre_genes
    		self.individus = []
    		self.nombre_initial_population = nombre_initial_population
    		for v in range(self.nombre_initial_population):
    			self.individus.append(individu(nombre_genes))
     
    	# selection : methode de selection des meilleurs N individus
    	def selection(self , N=-1):
    		if N == -1 : N = len(self.individus)
    		for v in self.individus:
    			v.evalutation(self.individus,self.distances)
    		#self.individus.sort(key=lambda a,b: a.valeur_individu - b.valeur_individu)
    		if N <= len(self.individus) : self.individus = self.individus[0:N]
     
    	# croisement : selectionne deux individus et croise leur gênes pour en creer de nouveaux
    	def croisement_deux(self , i1 , i2):
    		i = individu(self.nombre_genes)
    		l = len(i1.genes)
    		a = int(l / 2)
    		p2 = i2.genes[a:l]
    		p1 = i1.genes[0:a]
    		choices =list(range(0,l))
    		for v in p1:
    			try:choices.remove(v)
    			except : pass
    		for v in p2:
    			try : choices.remove(v)
    			except : pass
    		idc = 0
    		for id in range(len(p2)):
    			if p2[id] in p1:
    				p2[id] = choices[idc]
    				idc = idc + 1
    		i.genes = p1 + p2
    		return i
     
     
    	#  croise nombre_croisement individus aleatoires entre eux
    	def croisement_nombre(self , nombre_croisement):
    		new = []
    		for r in range(nombre_croisement):
    			v1 = random.randint(0 , len(self.individus)-1)
    			v2 = random.randint(0 , len(self.individus)-1)
    			new.append(self.croisement_deux(self.individus[v1] , self.individus[v2]))
    		self.individus = self.individus + new
     
     
     
    if __name__ == "__main__" :
    	nbrville = 10
    	#  population de 50 individus (100,200)
    	nombreindividus = 2
    	nombrecroisement = 2
    	p = population(nbrville,nombreindividus)
    	#  initialise les distances 
    	p.distances[0] = [2,3,4,5,6,7,8,9,10 ] # distance de la premiere ville avec la 2eme , 3eme , ... , 10eme
    	p.distances[1] = [11,12,13,14,15,16,17,18 ] # distance de la deuxieme ville avec la 3eme , 4eme , ... ,10eme
    	p.distances[2] = [19,20,21,22,23,24,25] #etc...
    	p.distances[3] = [26,27,28,29,30,31]
    	p.distances[4] = [32,33,34,35,36]
    	p.distances[5] = [37,38,39,40]
    	p.distances[6] = [41,42,43]
    	p.distances[7] = [44,45]
    	p.distances[8] = [46] # distance de la 9eme ville avec la 10eme ville
     
    	# 10 generations
    	# a chaque fois fait 100 croisements
    	# et selectionne les 10 premiers
     
    	for i in range(nbrville):
    		p.croisement_nombre(nombrecroisement)
    		p.selection(nbrville)
    	for v in p.individus:
    		print(v.genes,v.calcul_distance(p.distances))
    Bon, pour être très franc aussi, le dev en objets est assez complexe pour moi, j'ai du mal à comprendre le fonctionnement de ce programme.
    J'ai relu les docs mais bon...

    Donc si quelqu'un peut me donner un coup de main pour résoudre ce p.... de problème de sort, ce serait super cool....

    Merci

  5. #5
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Points : 40
    Points
    40
    Par défaut
    J'ai oublié, le sort qui pose soucis est en ligne 77, j'ai mis le code en commentaires afin de faire mes tests de fonctionnement.
    Dons retirer le # si vous voulez tester le tout..

    Merci.....

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Tonivege Voir le message
    tyrtamos, merci de tes remarques mais ..... je comprends pas (que dalle pour être plus claire.....).
    Si tu ne comprends pas, tu gagnerais du temps à regarder la doc: https://docs.python.org/3/library/st...html#list.sort

    Le tri d'une liste se fait toujours par comparaison entre ses éléments.

    Si la liste est composée de nombres ou de chaines, la méthode sort() suffit sans argument. Mais si les éléments de la liste sont complexes, comme des sous-listes ou comme toi des instances de classes, il faut préciser ce que sort doit prendre en compte pour comparer.

    Par exemple, si le liste est composé de sous-listes comme L=[[5,6], [9,3], [4,7], [8,4]], et si on veut trier selon le 2ème nombre (indice=1) de chaque sous-liste, il faut le préciser comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L.sort(key=lambda n: n[1])
    On peut dans certains cas introduire directement une fonction de comparaison, mais comme ça n'est pas prévu avec Python 3, on utilise la fonction cmp_to_key du module functools. Voir ici: https://docs.python.org/3/howto/sort...-cmp-parameter
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Sinon il est sans doute possible de créer sa propre fonction de comparaison, quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def compare(x):
        a, b = x
        return a.valeur_individu - b.valeur_individu
    et utiliser ta méthode sort de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.individus.sort(key=lambda x:compare(x))
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  8. #8
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Points : 40
    Points
    40
    Par défaut
    Messieurs,

    Merci de votre temps et de votre pédagogie.

    En lisant vos remarques et la doc sort, j'ai vu qu'il fallait 1 seul argument. Donc au lieu de trier sur une différence, je trie sur l'instance distance et cela fonctionne.

    Bon ben une bonne chose de faite.

    Encore merci et vraiment sympa :
    - votre sens de la pédagogie
    - vos signatures, pleines de bons sens car il est vrai que lorsque l'on vient sur ces forums d'entraide, on souhaite souvent avoir LA solution toute cuite sans trop se creuser la tête mais pas moi ah non pas moi, surtout pas moi, ah non pas moi alors...... Ah non c'est pas mon genre non.....

    Donc, la recette est exposer le problème, lire les reco et la doc proposée et tester et cela devrait bien se passer....

    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/02/2018, 10h57
  2. Erreur TypeError: a bytes-like object is required, not 'str'
    Par djbad dans le forum Général Python
    Réponses: 5
    Dernier message: 17/01/2017, 20h40
  3. Réponses: 2
    Dernier message: 23/08/2016, 11h22
  4. Réponses: 7
    Dernier message: 23/05/2012, 09h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo