Voir le flux RSS

danielhagnoul

Python. Compter les devises nécessaires pour payer les employés.

Noter ce billet
par , 02/12/2019 à 20h17 (517 Affichages)
Code Python : 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
#! python3
# coding: utf-8
 
from termcolor import cprint
from math import trunc
 
employes = {
    "Dupond": {
        "salaire": 4257.12,
        "composition": [],
    },
    "Durand": {
        "salaire": 2024.78,
        "composition": [],
    },
    "Pierre": {
        "salaire": 814.36,
        "composition": [],
    },
}
 
devises = [500, 200, 100, 50, 20, 10, 5, 2, 1, 0.5, 0.10, 0.05, 0.02, 0.01, ]
 
 
def compte_devises():
    for dico in employes.values():
        reste = dico["salaire"]
        for devise in devises:
            quotient = trunc(reste / devise)
            reste = round(reste - quotient * devise, 2)
            if quotient != 0:
                dico["composition"].append((devise, quotient))
 
 
compte_devises()
 
cprint('Les employés : {}'.format(employes), 'green')
 
'''
Les employés : {
    'Dupond': {'salaire': 4257.12, 'composition': [(500, 8), (200, 1), (50, 1), (5, 1), (2, 1), (0.1, 1), (0.02, 1)]}, 
    'Durand': {'salaire': 2024.78, 'composition': [(500, 4), (20, 1), (2, 2), (0.5, 1), (0.1, 2), (0.05, 1), (0.02, 1), (0.01, 1)]}, 
    'Pierre': {'salaire': 814.36, 'composition': [(500, 1), (200, 1), (100, 1), (10, 1), (2, 2), (0.1, 3), (0.05, 1), (0.01, 1)]}
}
'''
 
devises_total = []
 
for devise in devises:
    devises_total.append([devise, 0])
 
 
def compte_devises_total():
    for dico in employes.values():
        for t in dico["composition"]:
            for lst in devises_total:
                if lst[0] == t[0]:
                    lst[1] += t[1]
 
 
compte_devises_total()
 
cprint('Total des devises nécessaires : {}'.format(devises_total), 'cyan')
# [[500, 13], [200, 2], [100, 1], [50, 1], [20, 1], [10, 1], [5, 1], [2, 5], [1, 0], [0.5, 1], [0.1, 6], [0.05, 2], [0.02, 2], [0.01, 2]]

Envoyer le billet « Python. Compter les devises nécessaires pour payer les employés. » dans le blog Viadeo Envoyer le billet « Python. Compter les devises nécessaires pour payer les employés. » dans le blog Twitter Envoyer le billet « Python. Compter les devises nécessaires pour payer les employés. » dans le blog Google Envoyer le billet « Python. Compter les devises nécessaires pour payer les employés. » dans le blog Facebook Envoyer le billet « Python. Compter les devises nécessaires pour payer les employés. » dans le blog Digg Envoyer le billet « Python. Compter les devises nécessaires pour payer les employés. » dans le blog Delicious Envoyer le billet « Python. Compter les devises nécessaires pour payer les employés. » dans le blog MySpace Envoyer le billet « Python. Compter les devises nécessaires pour payer les employés. » dans le blog Yahoo

Tags: dict, list, round, trunc, tuple
Catégories
Programmation , Python , Python

Commentaires

  1. Avatar de bistouille
    • |
    • permalink
    Une autre méthode est de multiplier par 100 salaire et numéraire.

    Approche simpliste.

    Code python : 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
    NUMERAIRES = (
        500, 200, 100, 50, 20, 10, 5, 2, 1,
        0.5, 0.10, 0.05, 0.02, 0.01
    )
     
    def repartition_numeraires(montant) :
        montant *= 100
        nums = {}
        i = 0
        while montant :
            n, montant = divmod(montant, NUMERAIRES[i] * 100)
            nums[NUMERAIRES[i]] = int(n)
            i += 1
        return nums
     
    items = (
        ('Dupond', 4257.12),
        ('Durand', 2024.78),
        ('Pierre', 814.36),
    )
    employes = {}
    for nom, montant in items :
        employes[nom] = dict(
            salaire=dict(
                montant=montant,
                numeraires=dict.fromkeys(NUMERAIRES, 0),
            ),
        )
     
    for nom in employes :
        salaire = employes[nom]['salaire']
        num = repartition_numeraires(salaire['montant'])
        salaire['numeraires'].update(num)
     
    somme_salaires = round(
        sum(e['salaire']['montant'] for e in employes.values()),
        2
    )
    print('somme salaires :', somme_salaires)
     
    numeraires = dict.fromkeys(NUMERAIRES, 0)
    for e in employes.values() :
        for v in numeraires :
            numeraires[v] += e['salaire']['numeraires'][v]
     
    print(numeraires)
    somme_numeraires = round(sum(k * v for k, v in numeraires.items()), 2)
    print('somme numéraires :', somme_numeraires)
  2. Avatar de danielhagnoul
    • |
    • permalink


    J'ai utilisé round() pour ne pas utiliser la multiplication par 100.

    Depuis, j'ai découvert que la solution pythonique au problème d'arrondi monétaire c'est decimal : https://docs.python.org/fr/3.7/library/decimal.html
  3. Avatar de rawsrc
    • |
    • permalink
    Salut,

    j'ai voulu vérifier ce que cette ventilation représentait en terme de code en PHP :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
     
    $count  = $devises = ['500' => 0, '200' => 0, '100' => 0, '50' => 0, '20' => 0, '10' => 0, '5' => 0, '2' => 0, '1' => 0, '0.50' => 0, '0.20' => 0, '0.10' => 0, '0.05' => 0, '0.02' => 0, '0.01' => 0];
    $equipe = ['Dupont' => 4257.12, 'Durand' => 2024.78, 'Pierre' => 814.36];
     
    foreach ($equipe as $nom => $salaire) {
        $salaire *= 100;
        foreach ($devises as $d => &$nb) {
            $d         *= 100;
            $nb         = intdiv($salaire, $d);
            $salaire   -= $d * $nb;
            $count[$d] += $nb;      // nombre total de devises nécessaires [devise => nombre total]
        }
        $ventil[$nom] = $devises;   // [nom => [devise => nombre]]
    }
    Pour faciliter le truc, j'ai effectivement retenu la multiplication par 100

    Perso, je trouve que ça pique :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for dico in employes.values():
        for t in dico["composition"]:
            for lst in devises_total: