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 :

Algorithme de tri


Sujet :

Python

  1. #1
    Invité
    Invité(e)
    Par défaut Algorithme de tri
    Bonjour tout le monde,

    J'ai cette suite de nombres qui constitue une base de tri que nous allons nommé (1) :

    259 264 272 275 282 285 299 313 315 328 333 340 343 356 369 375 388 393 406 409 412 422 435 448 455 462 470 472 477 479 489 497 502 507 510 513 515 528 541 544 549 553 556 558 561 566 569 572 574 576 580 586 599 601 604 613 619 626 628 631 633 641 644 649 654 661 666 668 674 678 680 682 688 697 707 711 722 724 728 738 746 748 753 755 758 763 767 770 772 774 777 784 794 798 802 875 883 889 895 900 906 908 915 917 927 930 940 947 953 955 959 963 966 975 984 987 991 996 1001 1006 1012 1014 1018 1021 1028 1030 1034 1037 1042 1045 1049 1051 1059 1064 1069 1075 1081 1085 1087 1091 1095 1098 1102 1105 1108 1112 1114 1122 1128 1137 1143 1145 1151 1154 1158 1161 1165 1168 1171 1175 1177 1180 1183 1187 1189 1191 1193 1195 1198 1201 1203 1206 1209 1211 1215 1217 1219 1222 1225 1230 1234 1236 1239 1241 1243 1245 1247 1249 1252 1257 1262 1267 1272 1279 1284 1289 1294 1299 1305 1311 1317 1323 1326 1329 1332 1335 1341 1347 1353 1359 1362 1364 1369 1373 1376 1379 1383 1387 1391 1395 1399 1403 1407 1411 1414 1417 1419 1422 1424 1428 1432 1437 1441 1445 1449 1452 1456 1459 1461 1465 1469 1473 1477 1482 1487 1490 1492 1494 1497 1506 1510 1515 1519 1524 1529 1534 1539 1544 1547 1552 1557 1562 1567 1574 1577 1582 1584 1586 1591 1595 1600 1604 1608 1612 1616 1619 1623 1627 1637 1645 1653 1662 1668 1675 1679 1683 1686 1690 1694 1704 1708 1713 1721 1731 1736 1739 1746 1749 1753 1756 1760 1767 1771 1774 1777 1779 1783 1787 1790 1800 1804 1806 1808 1810 1812 1816 1821 1823 1825 1827 1829 1831 1835 1838 1840


    Je souhaite développer un algorithme qui me permettrait de "classer" une suite de nombres que je renseigne en fonction de la grille (1) que je vous ai transmise ci-dessus.

    L'algorithme permettrait entre autres de renseigner la valeur inférieure à celle qui a été saisie et afficher le résultat en séparant chaque valeur par une virgule.

    Pour être plus parlant, voici quelques exemples :


    Exemple n°1 :

    Je saisis cette suite de nombres en entrée d'algorithme : 1793,1794,1795,1832,1796,1797,1798,1799

    L'algorithme va scanner la base de tri (1) et afficher pour chaque valeur renseignée son nombre précédent dans la base. Le résultat supprime les doublons et sépare chaque valeur par une virgule : 1790,1821,1831

    Exemple n°2 :

    Je saisis cette suite de nombres en entrée d'algorithme : 1340,1339,1338,1337,1336,1352,1351,1350,1349,1348,1358,1357,1356,1355,1354,1346,1345,1344,1343,1342,1807,1809,1811

    L'algorithme va scanner la base de tri (1) et afficher pour chaque valeur renseignée son nombre précédent dans la base. Le résultat supprime les doublons et sépare chaque valeur par une virgule : 1335,1341,1347,1353,1806,1808,1810


    J'ai déjà commencé à me renseigner sur les algorithmes de tri mais il semble que ce que je recherche n'existe pas...

    Cet algorithme me permettrait de gagner un temps considérable sachant que j'ai des milliers de lignes à trier. J'ai déjà travaillé avec Python mais demeure encore débutant en programmation, toute aide sera la bienvenue !

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Je saisis cette suite de nombres en entrée d'algorithme : 1793,1794,1795,1832,1796,1797,1798,1799

    L'algorithme va scanner la base de tri (1) et afficher pour chaque valeur renseignée son nombre précédent dans la base. Le résultat supprime les doublons et sépare chaque valeur par une virgule : 1790,1821,1831
    Déjà là je ne comprends pas la présence de 1821 ? C'est le nombre précédent de quel nombre ?

    Citation Envoyé par CitronPixel Voir le message
    J'ai déjà commencé à me renseigner sur les algorithmes de tri mais il semble que ce que je recherche n'existe pas... :?

    Cet algorithme me permettrait de gagner un temps considérable sachant que j'ai des milliers de lignes à trier. J'ai déjà travaillé avec Python mais demeure encore débutant en programmation, toute aide sera la bienvenue !
    Ce n'est pas vraiment un tri, non ?

    Si les listes sont longues on peut utiliser la dichotomie (c'est plus rapide)...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Beginner. Voir le message

    Déjà là je ne comprends pas la présence de 1821 ? C'est le nombre précédent de quel nombre ?

    Vous avez totalement raison, 1821 n'est pas censé être affiché ! Comme vous pouvez le voir, l'erreur humaine est vite arrivée... c'est une raison de plus pour utiliser un algorithme/maccro afin d'automatiser cette tâche et réduire le risque d'erreur.

    Citation Envoyé par Beginner. Voir le message

    Ce n'est pas vraiment un tri, non ?

    Si les listes sont longues on peut utiliser la dichotomie (c'est plus rapide)...

    L'idée est de renseigner une suite de valeurs en entrée et générer en sortie le nombre précédent pour chaque valeur (en les séparant d'une virgule et en supprimant les doublons).

    Je ne connais pas la dichotomie, mais je pensais qu'il serait préférable de passer par un algo sachant qu'il faut renseigner des commandes qui supprime les doublons, affiche le résultat avec des virgules... etc

    Je confirme, la liste de valeur qui est renseignée en entrée est parfois très longue :

    Entrée : 530,543,542,559,516,529,517,545,562,531,518,500,546,563,532,519,547,564,533,520,548,565,521,504,534,522,505,535,567,550,506,568,551,523,536,471,570,602,552,600,473,524,537,508,571,554,474,509,538,525,539,526,555,475,478,511,514,527,540,557,476

    Sortie : 528,541,558,515,544,561,497,502,566,549,470,569,601,599,507,553,472,477,510,513,556

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Il suffit d'itérer sur les deux listes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    >>> l = "259 264 272 275 282 285 299 313 315 328 333 340 343 356 369 375 388 393 406 409 412 422 435 448 455 462 470 472 477 479 489 497 502 507 510 513 515 528 541 544 549 553 556 558 561 566 569 572 574 576 580 586 599 601 604 613 619 626 628 631 633 641 644 649 654 661 666 668 674 678 680 682 688 697 707 711 722 724 728 738 746 748 753 755 758 763 767 770 772 774 777 784 794 798 802 875 883 889 895 900 906 908 915 917 927 930 940 947 953 955 959 963 966 975 984 987 991 996 1001 1006 1012 1014 1018 1021 1028 1030 1034 1037 1042 1045 1049 1051 1059 1064 1069 1075 1081 1085 1087 1091 1095 1098 1102 1105 1108 1112 1114 1122 1128 1137 1143 1145 1151 1154 1158 1161 1165 1168 1171 1175 1177 1180 1183 1187 1189 1191 1193 1195 1198 1201 1203 1206 1209 1211 1215 1217 1219 1222 1225 1230 1234 1236 1239 1241 1243 1245 1247 1249 1252 1257 1262 1267 1272 1279 1284 1289 1294 1299 1305 1311 1317 1323 1326 1329 1332 1335 1341 1347 1353 1359 1362 1364 1369 1373 1376 1379 1383 1387 1391 1395 1399 1403 1407 1411 1414 1417 1419 1422 1424 1428 1432 1437 1441 1445 1449 1452 1456 1459 1461 1465 1469 1473 1477 1482 1487 1490 1492 1494 1497 1506 1510 1515 1519 1524 1529 1534 1539 1544 1547 1552 1557 1562 1567 1574 1577 1582 1584 1586 1591 1595 1600 1604 1608 1612 1616 1619 1623 1627 1637 1645 1653 1662 1668 1675 1679 1683 1686 1690 1694 1704 1708 1713 1721 1731 1736 1739 1746 1749 1753 1756 1760 1767 1771 1774 1777 1779 1783 1787 1790 1800 1804 1806 1808 1810 1812 1816 1821 1823 1825 1827 1829 1831 1835 1838 1840"
    >>> base = list(map(int, l.split(' ')))
    >>> pattern = [530,543,542,559,516,529,517,545,562,531,518,500,546,563,532,519,547,564,533,520,548,565,521,504,534,522,505,535,567,550,506,568,551,523,536,471,570,602,552,600,473,524,537,508,571,554,474,509,538,525,539,526,555,475,478,511,514,527,540,557,476]
    >>> result = set()
    >>> for p in pattern:
    ...     for idx, b in enumerate(base):
    ...             if b >= p:
    ...                     result.add(base[idx-1])
    ...                     break
    ... 
    >>> print(sorted(result))
    [470, 472, 477, 497, 502, 507, 510, 513, 515, 528, 541, 544, 549, 553, 556, 558, 561, 566, 569, 599, 601]

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Il suffit d'itérer sur les deux listes:

    [/code]
    Bonjour,

    Merci pour votre aide ! En renseignant votre code dans un compilateur (Python 3.6) j'ai un code "SyntaxError" y'a-t-il quelque chose de spécial que j'ai oublié de faire ?

    J'ai supprimé la dernière ligne censé être le résultat en sortie, fallait-il la laisser ?

    Si je comprend bien, je devrais par la suite modifier les valeurs du pattern pour les prochaines lignes à trier.

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Ha oui, pas le bon collé, j'ai corrigé le code.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je crois que vos modifications n'ont pas été prises en compte, j'ai toujours le même code qui s'affiche dans votre message #4

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Aucune erreur chez moi, tu as dû mal copier quelque chose.
    À quelle ligne est la SyntaxeError ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'ai copié ce code sans rien modifier sur un compilateur Python en ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    >>> l = "259 264 272 275 282 285 299 313 315 328 333 340 343 356 369 375 388 393 406 409 412 422 435 448 455 462 470 472 477 479 489 497 502 507 510 513 515 528 541 544 549 553 556 558 561 566 569 572 574 576 580 586 599 601 604 613 619 626 628 631 633 641 644 649 654 661 666 668 674 678 680 682 688 697 707 711 722 724 728 738 746 748 753 755 758 763 767 770 772 774 777 784 794 798 802 875 883 889 895 900 906 908 915 917 927 930 940 947 953 955 959 963 966 975 984 987 991 996 1001 1006 1012 1014 1018 1021 1028 1030 1034 1037 1042 1045 1049 1051 1059 1064 1069 1075 1081 1085 1087 1091 1095 1098 1102 1105 1108 1112 1114 1122 1128 1137 1143 1145 1151 1154 1158 1161 1165 1168 1171 1175 1177 1180 1183 1187 1189 1191 1193 1195 1198 1201 1203 1206 1209 1211 1215 1217 1219 1222 1225 1230 1234 1236 1239 1241 1243 1245 1247 1249 1252 1257 1262 1267 1272 1279 1284 1289 1294 1299 1305 1311 1317 1323 1326 1329 1332 1335 1341 1347 1353 1359 1362 1364 1369 1373 1376 1379 1383 1387 1391 1395 1399 1403 1407 1411 1414 1417 1419 1422 1424 1428 1432 1437 1441 1445 1449 1452 1456 1459 1461 1465 1469 1473 1477 1482 1487 1490 1492 1494 1497 1506 1510 1515 1519 1524 1529 1534 1539 1544 1547 1552 1557 1562 1567 1574 1577 1582 1584 1586 1591 1595 1600 1604 1608 1612 1616 1619 1623 1627 1637 1645 1653 1662 1668 1675 1679 1683 1686 1690 1694 1704 1708 1713 1721 1731 1736 1739 1746 1749 1753 1756 1760 1767 1771 1774 1777 1779 1783 1787 1790 1800 1804 1806 1808 1810 1812 1816 1821 1823 1825 1827 1829 1831 1835 1838 1840"
    >>> base = list(map(int, l.split(' ')))
    >>> pattern = [530,543,542,559,516,529,517,545,562,531,518,500,546,563,532,519,547,564,533,520,548,565,521,504,534,522,505,535,567,550,506,568,551,523,536,471,570,602,552,600,473,524,537,508,571,554,474,509,538,525,539,526,555,475,478,511,514,527,540,557,476]
    >>> result = set()
    >>> for p in pattern:
    ...     for idx, b in enumerate(base):
    ...             if b >= p:
    ...                     result.add(base[idx-1])
    ...                     break
    ... 
    >>> print(sorted(result))
    [470, 472, 477, 497, 502, 507, 510, 513, 515, 528, 541, 544, 549, 553, 556, 558, 561, 566, 569, 599, 601]
    Voilà ce que cela m'affiche :



    input
    File "main.py", line 1
    >>> l = "259 264 272 275 282 285 299 313 315 328 333 340 343 356 369 375 388 393 406 409 412 422 435 448 455 462 470 472 477 479 489 497 5
    02 507 510 513 515 528 541 544 549 553 556 558 561 566 569 572 574 576 580 586 599 601 604 613 619 626 628 631 633 641 644 649 654 661 666 668
    674 678 680 682 688 697 707 711 722 724 728 738 746 748 753 755 758 763 767 770 772 774 777 784 794 798 802 875 883 889 895 900 906 908 915 9
    17 927 930 940 947 953 955 959 963 966 975 984 987 991 996 1001 1006 1012 1014 1018 1021 1028 1030 1034 1037 1042 1045 1049 1051 1059 1064 106
    9 1075 1081 1085 1087 1091 1095 1098 1102 1105 1108 1112 1114 1122 1128 1137 1143 1145 1151 1154 1158 1161 1165 1168 1171 1175 1177 1180 1183
    1187 1189 1191 1193 1195 1198 1201 1203 1206 1209 1211 1215 1217 1219 1222 1225 1230 1234 1236 1239 1241 1243 1245 1247 1249 1252 1257 1262 12
    67 1272 1279 1284 1289 1294 1299 1305 1311 1317 1323 1326 1329 1332 1335 1341 1347 1353 1359 1362 1364 1369 1373 1376 1379 1383 1387 1391 1395
    1399 1403 1407 1411 1414 1417 1419 1422 1424 1428 1432 1437 1441 1445 1449 1452 1456 1459 1461 1465 1469 1473 1477 1482 1487 1490 1492 1494 1
    497 1506 1510 1515 1519 1524 1529 1534 1539 1544 1547 1552 1557 1562 1567 1574 1577 1582 1584 1586 1591 1595 1600 1604 1608 1612 1616 1619 162
    3 1627 1637 1645 1653 1662 1668 1675 1679 1683 1686 1690 1694 1704 1708 1713 1721 1731 1736 1739 1746 1749 1753 1756 1760 1767 1771 1774 1777
    1779 1783 1787 1790 1800 1804 1806 1808 1810 1812 1816 1821 1823 1825 1827 1829 1831 1835 1838 1840"
    ^
    SyntaxError: invalid syntax



    Juste pour confirmer, quel est le langage de programmation utilisé ?

  10. #10
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Un malencontreux retour à la ligne peut-être ?

    Voilà un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    l = "259 264 272 275 282 285 299 313 315 328 333 340 343 356 369 375 388 393 406 409 412 422 435 448 455 462 470 472 477 479 489 497 502 507 510 513 515 528 541 544 549 553 556 558 561 566 569 572 574 576 580 586 599 601 604 613 619 626 628 631 633 641 644 649 654 661 666 668 674 678 680 682 688 697 707 711 722 724 728 738 746 748 753 755 758 763 767 770 772 774 777 784 794 798 802 875 883 889 895 900 906 908 915 917 927 930 940 947 953 955 959 963 966 975 984 987 991 996 1001 1006 1012 1014 1018 1021 1028 1030 1034 1037 1042 1045 1049 1051 1059 1064 1069 1075 1081 1085 1087 1091 1095 1098 1102 1105 1108 1112 1114 1122 1128 1137 1143 1145 1151 1154 1158 1161 1165 1168 1171 1175 1177 1180 1183 1187 1189 1191 1193 1195 1198 1201 1203 1206 1209 1211 1215 1217 1219 1222 1225 1230 1234 1236 1239 1241 1243 1245 1247 1249 1252 1257 1262 1267 1272 1279 1284 1289 1294 1299 1305 1311 1317 1323 1326 1329 1332 1335 1341 1347 1353 1359 1362 1364 1369 1373 1376 1379 1383 1387 1391 1395 1399 1403 1407 1411 1414 1417 1419 1422 1424 1428 1432 1437 1441 1445 1449 1452 1456 1459 1461 1465 1469 1473 1477 1482 1487 1490 1492 1494 1497 1506 1510 1515 1519 1524 1529 1534 1539 1544 1547 1552 1557 1562 1567 1574 1577 1582 1584 1586 1591 1595 1600 1604 1608 1612 1616 1619 1623 1627 1637 1645 1653 1662 1668 1675 1679 1683 1686 1690 1694 1704 1708 1713 1721 1731 1736 1739 1746 1749 1753 1756 1760 1767 1771 1774 1777 1779 1783 1787 1790 1800 1804 1806 1808 1810 1812 1816 1821 1823 1825 1827 1829 1831 1835 1838 1840"
    base = list(map(int, l.split(' ')))
    pattern = [530,543,542,559,516,529,517,545,562,531,518,500,546,563,532,519,547,564,533,520,548,565,521,504,534,522,505,535,567,550,506,568,551,523,536,471,570,602,552,600,473,524,537,508,571,554,474,509,538,525,539,526,555,475,478,511,514,527,540,557,476]
    result = set()
    for p in pattern:
        for idx, b in enumerate(base):
            if b >= p:
                result.add(base[idx-1])
                break
    print(sorted(result))

  11. #11
    Invité
    Invité(e)
    Par défaut
    C'était un problème d'indentation que je n'avais pas remarqué en supprimant ">>>" et "•••"

    ça marche parfaitement bien merci beaucoup, à force de relire votre code j'ai fini par comprendre la logique !

    Y'a t-il une fonction à inclure dans le code afin de ne plus avoir d'espace dans le résultat mais uniquement cette forme : 1,2,3,4,5 ?

    J'ai pensé à la fonction .replace(" ","")

    À quel niveau je peux l'implanter ? Cela ne semble pas réagir dans la ligne du print.

    Merci
    Dernière modification par Invité ; 25/05/2020 à 11h15.

  12. #12
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Le résultat est une liste et python affiche toujours le contenu des listes en séparant les items par des espaces.
    Ces espaces n'existent pas réellement, donc ne peuvent être supprimés.

    Rien ne t'empêche de formater toi-même la ligne à afficher, bien sur.

  13. #13
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par CitronPixel Voir le message
    Y'a t-il une fonction à inclure dans le code afin de ne plus avoir d'espace dans le résultat mais uniquement cette forme : 1,2,3,4,5 ?
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    str_result =  ",".join(list(map(str, result)))
    print(str_result)
    result est le résultat fourni par le code de VinsS...

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    str_result =  ",".join(list(map(str, result)))
    print(str_result)
    result est le résultat fourni par le code de VinsS...

    Super, merci beaucoup pour votre aide j'en ai appris des choses !

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

Discussions similaires

  1. Complexité de l'algorithme de Tri Fusion
    Par judge06 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 26/03/2007, 22h04
  2. A propos des algorithmes de tri..
    Par Kerwando dans le forum C++
    Réponses: 4
    Dernier message: 19/08/2006, 11h43
  3. Probleme avec mon algorithme de tri
    Par kaygee dans le forum Langage
    Réponses: 6
    Dernier message: 09/01/2006, 21h23
  4. Réponses: 16
    Dernier message: 10/11/2005, 22h51
  5. algorithme de tri tableau :afficher que les éléments unique
    Par sofiane61 dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 31/03/2005, 19h50

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