Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/09/2019, à 15:59

Pam547

[Résolu] Trie et selection dans tupple, liste ou dict (Python3)

Bonjour,

Je suis encore à vouloir planter mes poireaux en lignes de commande.
Alors j'ai un dictionnaire contenant l'historique des parcelles :

Historiques = {((-1000, -1000),2015):('Pruneau', 'Courges'),
	((0, 0),2018):('Pomme de terre', 'NA'),
	((0, 0),2019):('Ail', 'Radis'),
	((0, 1),2019):('Pomme de terre', 'Laitue romaine'),
	((2, 2), 2019): ('Épinard', 'NA')}

J'aimerai afficher à peu-prêt la même chose en sortant la ligne ((0, 0),2018):('Pomme de terre', 'NA'),. parce que pour afficher ce qui est cultiver présentement c'est inutile.
En clair, supprimer de l'affichage courant tout ce qui est à déclasser parce que chronologiquement inutile. Ici, dans ce dictionnaire sur la parcelle ((0, 0)) j'ai deux années, je voudrais garder la plus récente des deux.

Je dois quand même garder ces informations stockées dans le dictionnaire, parce que pour permettre l'assistance de gestion en biodynamie et être pertinent dans la rotation des cultures et de l'assolement, il faut un historique sur cinq voir sept ans.

J'ai récupéré les données en créant des listes avec list(Historiques.keys)[n][0], j'ai mis des conditions, fait des boucles for, etc elles m'ont mis la tête en pastèque.

J'imagine pouvoir m'en sortir avec la fonction sort(), mais je sens que la de suite elle va me prendre le melon.
Vous auriez une solution simple s'il vous plaît d'ici à ce que je m'y remette ?

Merci pour votre attention.

Dernière modification par Pam547 (Le 20/09/2019, à 23:00)


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne

#2 Le 20/09/2019, à 16:03

pingouinux

Re : [Résolu] Trie et selection dans tupple, liste ou dict (Python3)

Bonjour,
Je ne comprends pas ce que tu veux faire. Quel résultat veux-tu obtenir ?

Hors ligne

#3 Le 20/09/2019, à 16:13

Pam547

Re : [Résolu] Trie et selection dans tupple, liste ou dict (Python3)

Dans ce script, je propose des tâches à faire convenant à la saison présente.

Là, aujourd'hui, en lançant le script, avec le dictionnaire Plantes configuré comme il l'est aujourd'hui il nous propose :

Script a écrit :

Nous sommes le 20/09/2019
C'est la fin de l'été. L'engrais vert est-il en place ?
Voilà la liste de ce qui est pour le moment cultivé
((0, 0), 2019) ('Ail', 'Radis')
((2, 2), 2019) ('Épinard', 'NA')
((0, 1), 2019) ('Pomme de terre', 'Laitue romaine')
Vous pouvez semer des  Épinard s
Vous pouvez semer des  Oignon s
Vous pouvez semer des  Poireau s
Vous pouvez planter des  Poireau s
Saisir le nom d'une plante à semer ou à planter parmi celles-ci :  ['Épinard', 'Oignon', 'Poireau'] ['Poireau']

Il informe donc que certaines variétés d'épinard peuvent être semés. Et que sur la parcelle (2,2) des épinards sont cultivés.

J'ai obtenu l'affichage que je voulais par rapport à l'Historiques, mais les données ne sont pas vraiment utilisable pour signaler sur la ligne Vous pouvez semer des  Épinard s qu'une parcelle en est farcie.
Voilà comment j'ai fait :

def afficher_cultures_presentes():
	print('Voilà la liste de ce qui est pour le moment cultivé')
	n=0
	global Presence
	Presence = []
	while n < len(list(Historiques.keys())):
		if int(time.strftime('%Y', time.localtime())) == list(Historiques.keys())[n][1]:
		Presence.append(list(Historiques.keys())[n])
		n += 1
	for track in Presence:
		print(track, Historiques[track])

Le résultat de print(track, Historiques[track]) n'est vraiment pas pratique à utiliser. C'est pourquoi je cherche une autre méthode de traitement.

Dernière modification par Pam547 (Le 20/09/2019, à 16:14)


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne

#4 Le 20/09/2019, à 16:31

pingouinux

Re : [Résolu] Trie et selection dans tupple, liste ou dict (Python3)

Tu peux déjà simplifier afficher_cultures_presentes :

def afficher_cultures_presentes():
    print('Voilà la liste de ce qui est pour le moment cultivé')
    an = int( time.strftime('%Y', time.localtime()) )
    for k in Historiques:
        if an == k[1]: print(k, Historiques[k])

ou bien

def afficher_cultures_presentes():
    print('Voilà la liste de ce qui est pour le moment cultivé')
    an = int( time.strftime('%Y', time.localtime()) )
    for k in filter( lambda x: x[1]==an, Historiques ): print(k, Historiques[k])

Dernière modification par pingouinux (Le 20/09/2019, à 16:35)

Hors ligne

#5 Le 20/09/2019, à 16:50

Pam547

Re : [Résolu] Trie et selection dans tupple, liste ou dict (Python3)

Oui merci beaucoup Pingouinux,
Il faudrait que je m'imprime cette logique dans la purée qui me sert de cerveau . Net et précis.

L'inconvénient de cette méthode c'est que je perds la ligne parcelle (-1000,-1000) qui n'a pas été cultivé depuis 4 ans.

À plus tard. Merci encore.


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne

#6 Le 20/09/2019, à 16:56

pingouinux

Re : [Résolu] Trie et selection dans tupple, liste ou dict (Python3)

Pam547 #5 a écrit :

L'inconvénient de cette méthode c'est que je perds la ligne parcelle (-1000,-1000) qui n'a pas été cultivé depuis 4 ans.

C'est normal, car tu ne cherches que les lignes relatives à 2019. Ou alors, il faut choisir un autre critère.

Hors ligne

#7 Le 20/09/2019, à 22:59

Pam547

Re : [Résolu] Trie et selection dans tupple, liste ou dict (Python3)

Voui, évidemment,

Enfin bref, voilà une solution qui me convient mieux:

def afficher_cultures_presentes():
	n = 0
	global HParc
	HParc = []
	while n < len(list(Historiques.keys())):
		m = len(HParc)
		HParc.append(list(Historiques.keys())[n]) #Récupère les tuples clés du dictionnaire dans une liste.
		while m >= 0: #Compare à partir du dernier rentré si la parcelle est dans la liste
			if HParc[m][0] == HParc[n][0] and m != n: #Si elle est dans la liste sans être la même entrée
				if HParc[m][1] > HParc[n][1]: #Faire la comparaison
					del HParc[n]
					HParc.append('NA') #Garder la variable m à sa valeur ou l'indexation devient erronée.
				else:
					del HParc[m]
					HParc.append('NA')  #Garder la variable m à sa valeur.
			m -= 1
		n += 1
	while 'NA' in HParc:
		HParc.remove('NA')	#Nettoyage

Quoi qu'il en soit, merci bien.
Bonne continuation.
À bientôt.


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne

#8 Le 21/09/2019, à 07:39

pingouinux

Re : [Résolu] Trie et selection dans tupple, liste ou dict (Python3)

Si j'ai bien compris, ceci devrait être équivalent :

def afficher_cultures_presentes():
  global HParc
  HParc = sorted(Historiques,key=lambda x:x[1],reverse=True)
  n = 0
  while n<len(HParc):
      m=n+1
      while True:
          try:
             if HParc[n][0] == HParc[m][0]: del HParc[m]; continue
             m+=1
          except IndexError: break
      n+=1

Édité : Simplification

Dernière modification par pingouinux (Le 21/09/2019, à 07:47)

Hors ligne

#9 Le 21/09/2019, à 08:54

Pam547

Re : [Résolu] Trie et selection dans tupple, liste ou dict (Python3)

J'ai réussi à mieux expliquer wink.

Je me demandais comment utiliser la fonction sorted ou list.sort(). Et comment utiliser les index.
Je l'avais sous les yeux. hmm

Première fois que je constate l'utilité de l'instruction try / except.
Je me resservirai probablement de cette solution pour construire des listes donc.
Et plutôt que de faire du nettoyage, je casserai les routines tongue.

Merci, beaucoup pingouinux, c'est génial.

Bonne continuation à tous.


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne

#10 Le 21/09/2019, à 11:01

Pam547

Re : [Résolu] Trie et selection dans tupple, liste ou dict (Python3)

Bizarre,

Avec le code avec la méthode append j'ai ce résultat :

:~/Bureau/Jardin/ProgrammePy$ ./script.py 
Nous sommes le 21/09/2019
C'est la fin de l'été. L'engrais vert est-il en place ?
Voilà la liste de ce qui est pour le moment cultivé
((-1000, -1000), 2015) ('Pruneau', 'Courges')
((0, 0), 2019) ('Ail', 'Radis')
((0, 1), 2019) ('Pomme de terre', 'Laitue romaine')
((2, 2), 2019) ('Carotte', 'Épinard')
[b]C'est le moment de semer des Épinard s, même si vous en avez probablement encore sur ((2, 2), 2019)[/b]
C'est le moment de semer des Oignon s
C'est le moment de semer des Poireau s
C'est le moment de planter des Poireau s
Saisir le nom d'une plante à semer ou à planter parmi celles-ci :  ['Épinard', 'Oignon', 'Poireau'] ['Poireau']

Et avec celui utilisant la méthode sort :

:~/Bureau/Jardin/ProgrammePy$ ./script.py 
Nous sommes le 21/09/2019
C'est la fin de l'été. L'engrais vert est-il en place ?
Voilà la liste de ce qui est pour le moment cultivé
((0, 0), 2019) ('Ail', 'Radis')
((0, 1), 2019) ('Pomme de terre', 'Laitue romaine')
((2, 2), 2019) ('Carotte', 'Épinard')
((-1000, -1000), 2015) ('Pruneau', 'Courges')
[b]C'est le moment de semer des Épinard s, même si vous en avez probablement encore sur ((-1000, -1000), 2015)[/b]
C'est le moment de semer des Oignon s
C'est le moment de semer des Poireau s
C'est le moment de planter des Poireau s
Saisir le nom d'une plante à semer ou à planter parmi celles-ci :  ['Épinard', 'Oignon', 'Poireau'] ['Poireau']

Rien qu'un détail probablement, mais c'est quand même surprenant.

Dernière modification par Pam547 (Le 21/09/2019, à 11:02)


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne

#11 Le 21/09/2019, à 11:07

Pam547

Re : [Résolu] Trie et selection dans tupple, liste ou dict (Python3)

Voilà la partie du code responsable, comme tu es dans élan de simplification, peut-être que j'aurais encore ce bonus big_smile

def proposer_activite():
	global Asemer, Aplanter
	Asemer, Aplanter = [], []
	for n in list(Plantes.keys()):
		SmDeb, SmFin = Plantes[n][3], Plantes[n][4]		# Récupérer dates Semis dans dictionnaire Plantes
		if Saisons.index(SmDeb) == Saisons.index(SmFin):
			pass
		elif Saisons.index(SmDeb) < Saisons.index(SmFin):
			track = Saisons.index(SmDeb)
			while track <= Saisons.index(SmFin):
				if Saisons[track] == Saison :
					Asemer.append(n)        # Ajoute les plantes dont "le cycle de vie commence" en début d'année (humaine)
				track += 1
		elif Saisons.index(SmDeb) > Saisons.index(SmFin):
			track = Saisons.index(SmDeb)
			while track <= 12:
				if Saisons[track] == Saison :
					Asemer.append(n)		# Ajoute les plantes dont "le cycle de vie commence" en fin d'année (humaine) 
				track += 1
			track = 0
			while track <= Saisons.index(SmFin):
				if Saisons[track] == Saison :
					Asemer.append(n)		# Ajoute les plantes dont "le cycle de vie commence" en fin d'année (humaine) 
				track += 1
	for n in list(Plantes.keys()):
		PltDeb, PltFin = Plantes[n][5], Plantes[n][6]		#Récupérer dates Plantations dans dictionnaire Plantes
		if Saisons.index(PltDeb) == Saisons.index(PltFin):
			pass
		elif Saisons.index(PltDeb) < Saisons.index(PltFin):
			track = Saisons.index(PltDeb)
			while track <= Saisons.index(PltFin):
				if Saisons[track] == Saison :
					Aplanter.append(n)        # Ajoute les plantes dont "le cycle de vie commence" en début d'année (humaine) 
				track += 1
		elif Saisons.index(PltDeb) > Saisons.index(PltFin):
			track = Saisons.index(PltDeb)
			while track <= 12:
				if Saisons[track] == Saison :
					Aplanter.append(n)	        # Ajoute les plantes dont "le cycle de vie commence" en fin d'année (humaine) 
				track += 1
			track = 0
			while track <= Saisons.index(PltFin):
				if Saisons[track] == Saison :
					Aplanter.append(n)		# Ajoute les plantes dont "le cycle de vie commence" en fin d'année (humaine) 
				track += 1
	HCultive = []
	for m in HParc :
		HCultive.append(Historiques[m][0])
		HCultive.append(Historiques[m][1])
	for n in Asemer:
		if n in HCultive:
			print('C\'est le moment de semer des', n, 's, même si vous en avez probablement encore sur', m)
		else:
			print('C\'est le moment de semer des', n, 's')			
	for n in Aplanter :
		if n in HCultive:
			print('C\'est le moment de planter des', n, 's, même si vous en avez probablement encore sur', m)
		else:
			print('C\'est le moment de planter des', n, 's')

wink


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne

#12 Le 21/09/2019, à 11:20

Pam547

Re : [Résolu] Trie et selection dans tupple, liste ou dict (Python3)

Ah oui,

C'était une coïncidence que le code affiche le « bon » résultat.

	HCultive = []
	for m in HParc :
		HCultive.append(Historiques[m][0])
		HCultive.append(Historiques[m][1])
	for n in Asemer:
		if n in HCultive:
			print('C\'est le moment de semer des', n, 's, même si vous en avez probablement encore sur', m)
		else:
			print('C\'est le moment de semer des', n, 's')			
	for n in Aplanter :
		if n in HCultive:
			print('C\'est le moment de planter des', n, 's, même si vous en avez probablement encore sur', m)
		else:
			print('C\'est le moment de planter des', n, 's')

Bref, tip, top. Merci pour tout.
Je file.


Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne

#13 Le 21/09/2019, à 11:46

Pam547

Re : [Résolu] Trie et selection dans tupple, liste ou dict (Python3)

L'espoir fait vivre smile :
Fix :

	HCultive = []
	for m in HParc :
		HCultive.append(Historiques[m][0])
		HCultive.append(Historiques[m][1])
	for n in Asemer:
		if n in HCultive:
			for m in HParc :
				if n == Historiques[m][0] or n == Historiques[m][1]:
					print('C\'est le moment de semer des', n, 's, même si vous en avez probablement encore sur', m)
		else:
			print('C\'est le moment de semer des', n, 's')				
	for n in Aplanter :
		if n in HCultive:
			for m in HParc :
				if n == Historiques[m][0] or n == Historiques[m][1]:
					print('C\'est le moment de planter des', n, 's, même si vous en avez probablement encore sur', m)
		else:
			print('C\'est le moment de planter des', n, 's')

Art.9.(code civil)  Chacun a droit au respect de sa vie privée.

Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.

Hors ligne