From 761f4b26e0a25139994cb2cfa3d0e9e902e58782 Mon Sep 17 00:00:00 2001 From: Lafrite Date: Mon, 22 Apr 2013 16:59:40 +0200 Subject: [PATCH 1/6] Improve comments --- pralo.py | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/pralo.py b/pralo.py index 208ac32..7e8f02d 100755 --- a/pralo.py +++ b/pralo.py @@ -24,12 +24,17 @@ import optparse # Fonctions # ------------------------------ def extrait_from_file(file_name): - """Extrait les informations à partir d'un fichier""" + """ + Extrait les informations à partir d'un fichier + + :param file_name: nom du fichier avec les comptes + :return: liste [[nom,montant,jours],...] + """ file = open(file_name, "r") try: reader = csv.reader(file, delimiter = ",") compte = list(reader) - for i in compte[1:]: + for i in compte[1:]: # On parcourt les lignes i[1] = int(i[1]) i[2] = int(i[2]) return compte @@ -38,7 +43,12 @@ def extrait_from_file(file_name): def echange(l): - """Algo recursif pour gérer les échanges""" + """ + Algo recursif pour gérer les échanges + + :param l: liste des valeurs associées aux débits des comptes + :return: liste des valeurs associées aux débits des comptes après le remboursement + """ l.sort(key = lambda s: s[1]) m = l[0] M = l[-1] @@ -73,7 +83,12 @@ def echange(l): return [res] def forfait(compte): - """Gère le nombre resté à Pralo""" + """ + Gère le nombre resté à Pralo + + :param compte: comptes de ce que chacun a payé [[nom, montant,jours],...] + :return: Comptes des crédits de chacun envers la communauté + """ cout_total = sum([c[1] for c in compte]) print("Cout total de Pralo: {cout_tot}".format(cout_tot = cout_total)) @@ -102,7 +117,11 @@ def normalise(compte): def affiche_final(donRec): - """Affiche qui donne quoi à qui à partir de la liste""" + """ + Affiche qui donne quoi à qui à partir de la liste + + :param donRec: liste avec qui doit quoi à qui [[qui, àqui, quoi]...] + """ for g in donRec: print("{don} donne {montant} à {rec}".format(don = g[0], rec = g[1], montant = g[2])) From 3f0f03b2f0563a79b870b9088378a331d3292581 Mon Sep 17 00:00:00 2001 From: Lafrite Date: Mon, 22 Apr 2013 17:24:59 +0200 Subject: [PATCH 2/6] Seuil implemented (need to build a check account to verify accounts) --- pralo.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pralo.py b/pralo.py index 7e8f02d..54935f7 100755 --- a/pralo.py +++ b/pralo.py @@ -42,11 +42,12 @@ def extrait_from_file(file_name): file.close() -def echange(l): +def echange(l, seuil = 0): """ Algo recursif pour gérer les échanges :param l: liste des valeurs associées aux débits des comptes + :param seuil: seuil à partir duquel on ne doit plus rien. :return: liste des valeurs associées aux débits des comptes après le remboursement """ l.sort(key = lambda s: s[1]) @@ -75,10 +76,13 @@ def echange(l): l.remove(M) # On change la valeur du min l[0] = [m[0], m2] + + # Gestion du Seuil + l = [i for i in l if abs(i[1]) >= seuil] if (len(l) > 1): #print(l) - return [res] + echange(l) + return [res] + echange(l,seuil=seuil) else: return [res] @@ -96,7 +100,7 @@ def forfait(compte): print("Le nombre de jour passé {njour}".format(njour = nbr_jour)) cout_jour = cout_total / nbr_jour - print("Cout au jour: {cout}".format(cout = cout_jour)) + print("Cout au jour: {cout}".format(cout = round(cout_jour,2))) print("\n") @@ -123,12 +127,7 @@ def affiche_final(donRec): :param donRec: liste avec qui doit quoi à qui [[qui, àqui, quoi]...] """ for g in donRec: - print("{don} donne {montant} à {rec}".format(don = g[0], rec = g[1], montant = g[2])) - - -def elimine_seuil(liste, seuil): - """Elimine les éléments de la liste qui sont sous le seuil """ - pass + print("{don} donne {montant} à {rec}".format(don = g[0], rec = g[1], montant = round(g[2],2))) # ------------------------------ @@ -140,6 +139,7 @@ if __name__ == '__main__': parser = optparse.OptionParser() # options proposée parser.add_option("-f","--file",action="store", type = "string", dest="file_name", help="Analyse les comptes à partir du fichier donné en argument") + parser.add_option("-e","--seuil",action="store", type = "int", dest="seuil",default=0, help="Seuil à partir duquel on concidère qu'il n'est plus nécessaire de payer.") # Digestion (options, args) = parser.parse_args() @@ -147,7 +147,7 @@ if __name__ == '__main__': compte = extrait_from_file(options.file_name)[1:] # compte_normalise = normalise(compte) compte_normalise = forfait(compte) - final = echange(compte_normalise) + final = echange(compte_normalise, options.seuil) affiche_final(final) # ------------------------------ From 6d1db611e7022478f71f836c3f25859c82acaa1c Mon Sep 17 00:00:00 2001 From: Lafrite Date: Sun, 12 May 2013 21:24:52 +0200 Subject: [PATCH 3/6] =?UTF-8?q?je=20ne=20sais=20pas=20o=C3=B9=20j'en=20sui?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pralo.py | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/pralo.py b/pralo.py index 7e8f02d..645fc75 100755 --- a/pralo.py +++ b/pralo.py @@ -33,11 +33,24 @@ def extrait_from_file(file_name): file = open(file_name, "r") try: reader = csv.reader(file, delimiter = ",") - compte = list(reader) - for i in compte[1:]: # On parcourt les lignes - i[1] = int(i[1]) - i[2] = int(i[2]) - return compte + r_comptes = list(reader) + header = r_comptes.pop(0) # On récupère le premier élément (les headers) + + comptes = [] + + for c in r_comptes: # On parcourt les lignes pour typer les éléments correctement + compte = {} + for (i,h) in enumerate(header): + if "nom" in h.lower(): + compte["nom"] = c[i] + if "montant" in h.lower(): + compte["montant"] = eval(c[i]) + if "jour" in h.lower(): + compte["jours"] = int(c[i]) + comptes += [compte] + + print(comptes) + return comptes finally: file.close() @@ -89,10 +102,10 @@ def forfait(compte): :param compte: comptes de ce que chacun a payé [[nom, montant,jours],...] :return: Comptes des crédits de chacun envers la communauté """ - cout_total = sum([c[1] for c in compte]) + cout_total = sum([c["montant"] for c in compte]) print("Cout total de Pralo: {cout_tot}".format(cout_tot = cout_total)) - nbr_jour = sum([c[2] for c in compte]) + nbr_jour = sum([c["jours"] for c in compte]) print("Le nombre de jour passé {njour}".format(njour = nbr_jour)) cout_jour = cout_total / nbr_jour @@ -102,16 +115,16 @@ def forfait(compte): new_compte = [] for pers in compte: - new_compte += [[pers[0], (pers[1] - pers[2] * cout_jour)]] + new_compte += [[pers["nom"], (pers["montant"] - pers["jours"] * cout_jour)]] return new_compte def normalise(compte): """Centre en 0 les comptes""" - moyenne = sum([c[1] for c in compte]) / len(compte) + moyenne = sum([c["montant"] for c in compte]) / len(compte) compte_normalise = compte for (i,n) in enumerate(compte): - compte_normalise[i][1] = compte[i][1] - moyenne + compte_normalise[i]["montant"] = compte[i]["montant"] - moyenne return compte_normalise From 7c093fa48124b0463d5e6de84c1e4a4bde42f6d0 Mon Sep 17 00:00:00 2001 From: Lafrite Date: Sun, 1 Sep 2013 19:59:45 +0200 Subject: [PATCH 4/6] Solve bug which removed the first personn in accound --- pralo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pralo.py b/pralo.py index 5419cc1..db66ffd 100755 --- a/pralo.py +++ b/pralo.py @@ -49,7 +49,6 @@ def extrait_from_file(file_name): compte["jours"] = int(c[i]) comptes += [compte] - print(comptes) return comptes finally: file.close() @@ -120,6 +119,7 @@ def forfait(compte): new_compte = [] for pers in compte: new_compte += [[pers["nom"], (pers["montant"] - pers["jours"] * cout_jour)]] + return new_compte def normalise(compte): @@ -157,7 +157,7 @@ if __name__ == '__main__': (options, args) = parser.parse_args() if options.file_name: - compte = extrait_from_file(options.file_name)[1:] + compte = extrait_from_file(options.file_name) # compte_normalise = normalise(compte) compte_normalise = forfait(compte) final = echange(compte_normalise, options.seuil) From 9cacf750c74c276e8dfbf283f1138f54be88ca64 Mon Sep 17 00:00:00 2001 From: Lafrite Date: Sun, 1 Sep 2013 20:28:26 +0200 Subject: [PATCH 5/6] account object done --- account.py | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ pralo.py | 49 +++++------------------------------------ 2 files changed, 69 insertions(+), 44 deletions(-) create mode 100644 account.py diff --git a/account.py b/account.py new file mode 100644 index 0000000..c6d2a74 --- /dev/null +++ b/account.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# encoding: utf-8 + + +class Account(object): + """@todo""" + + def __init__(self, account): + """Initiate the account as a list + + :param account: list of tuples (length 2 with name and credit) [("bob", 4), ("hip",2)...] + + """ + self._account = account + + def tribut(self, seuil = 0): + """Tels who owns what to who (recursive algorithm + + :param seuil: seuil à partir duquel on ne doit plus rien. + :return: liste des valeurs associées aux débits des comptes après le remboursement + """ + self._account.sort(key = lambda s: s[1]) + m = self._account[0] + M = self._account[-1] + + res = ['doneur','receveur',0] + + # Si celui qui doit le plus doit moins que le crédit que celui qui a le plus grand crédit + # Il va donc tout lui donner + if abs(m[1]) <= abs(M[1]): + M2 = M[1] + m[1] + # print("{em} donne {em_n} à {eM} donc {em} devient {eM2}".format(em = m[0], em_n = abs(m[1]), eM = M[0] , eM2 = M2)) + res = [m[0], M[0], abs(m[1])] + # On enleve le minimum + self._account.remove(m) + # ON change la valeur du max + self._account[-1] = [M[0],M2] + + # Sinon il donne juste de quoi compenser + else: + m2 = m[1] + M[1] + # print("{em} donne {eM_n} à {eM} et devient {em2}".format(em = m[0] , em2 = m2 , eM = M[0], eM_n = M[1])) + res = [m[0], M[0], abs(M[1])] + # On eleve le max + self._account.remove(M) + # On change la valeur du min + self._account[0] = [m[0], m2] + + # Gestion du Seuil + self._account = [i for i in self._account if abs(i[1]) >= seuil] + + if (len(self._account) > 1): + #print(self._account) + return [res] + self.tribut(seuil=seuil) + else: + return [res] + + def __add__(self, account): + pass + +# ----------------------------- +# Reglages pour 'vim' +# vim:set autoindent expandtab tabstop=4 shiftwidth=4: +# cursor: 16 del diff --git a/pralo.py b/pralo.py index db66ffd..cf2b713 100755 --- a/pralo.py +++ b/pralo.py @@ -16,6 +16,8 @@ import csv import os import optparse +from account import Account + # ------------------------------ # Classes # ------------------------------ @@ -54,49 +56,6 @@ def extrait_from_file(file_name): file.close() -def echange(l, seuil = 0): - """ - Algo recursif pour gérer les échanges - - :param l: liste des valeurs associées aux débits des comptes - :param seuil: seuil à partir duquel on ne doit plus rien. - :return: liste des valeurs associées aux débits des comptes après le remboursement - """ - l.sort(key = lambda s: s[1]) - m = l[0] - M = l[-1] - - res = ['doneur','receveur',0] - - # Si celui qui doit le plus doit moins que le crédit que celui qui a le plus grand crédit - # Il va donc tout lui donner - if abs(m[1]) <= abs(M[1]): - M2 = M[1] + m[1] - # print("{em} donne {em_n} à {eM} donc {em} devient {eM2}".format(em = m[0], em_n = abs(m[1]), eM = M[0] , eM2 = M2)) - res = [m[0], M[0], abs(m[1])] - # On enleve le minimum - l.remove(m) - # ON change la valeur du max - l[-1] = [M[0],M2] - - # Sinon il donne juste de quoi compenser - else: - m2 = m[1] + M[1] - # print("{em} donne {eM_n} à {eM} et devient {em2}".format(em = m[0] , em2 = m2 , eM = M[0], eM_n = M[1])) - res = [m[0], M[0], abs(M[1])] - # On eleve le max - l.remove(M) - # On change la valeur du min - l[0] = [m[0], m2] - - # Gestion du Seuil - l = [i for i in l if abs(i[1]) >= seuil] - - if (len(l) > 1): - #print(l) - return [res] + echange(l,seuil=seuil) - else: - return [res] def forfait(compte): """ @@ -160,7 +119,9 @@ if __name__ == '__main__': compte = extrait_from_file(options.file_name) # compte_normalise = normalise(compte) compte_normalise = forfait(compte) - final = echange(compte_normalise, options.seuil) + #final = echange(compte_normalise, options.seuil) + account = Account(compte_normalise) + final = account.tribut(options.seuil) affiche_final(final) # ------------------------------ From ce911b9c201583940b9a809704cf01a89afe2770 Mon Sep 17 00:00:00 2001 From: Lafrite Date: Tue, 3 Sep 2013 10:04:55 +0200 Subject: [PATCH 6/6] add output instead of print --- pralo.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pralo.py b/pralo.py index cf2b713..851f671 100755 --- a/pralo.py +++ b/pralo.py @@ -57,23 +57,23 @@ def extrait_from_file(file_name): -def forfait(compte): +def forfait(compte, output = print): """ - Gère le nombre resté à Pralo + Gère le nombre de jours resté à Pralo et affiche quelques stats :param compte: comptes de ce que chacun a payé [[nom, montant,jours],...] :return: Comptes des crédits de chacun envers la communauté """ cout_total = sum([c["montant"] for c in compte]) - print("Cout total de Pralo: {cout_tot}".format(cout_tot = cout_total)) + output("Cout total de Pralo: {cout_tot}".format(cout_tot = cout_total)) nbr_jour = sum([c["jours"] for c in compte]) - print("Le nombre de jour passé {njour}".format(njour = nbr_jour)) + output("Le nombre de jour passé {njour}".format(njour = nbr_jour)) cout_jour = cout_total / nbr_jour - print("Cout au jour: {cout}".format(cout = round(cout_jour,2))) + output("Cout au jour: {cout}".format(cout = round(cout_jour,2))) - print("\n") + output("\n") new_compte = [] for pers in compte: @@ -92,14 +92,14 @@ def normalise(compte): return compte_normalise -def affiche_final(donRec): +def affiche_final(donRec, output = print): """ Affiche qui donne quoi à qui à partir de la liste :param donRec: liste avec qui doit quoi à qui [[qui, àqui, quoi]...] """ for g in donRec: - print("{don} donne {montant} à {rec}".format(don = g[0], rec = g[1], montant = round(g[2],2))) + output("{don} donne {montant} à {rec}".format(don = g[0], rec = g[1], montant = round(g[2],2))) # ------------------------------