Python : liste de fractions — Les-mathematiques.net The most powerful custom community solution in the world

Python : liste de fractions

J'ai un bête petit problème. J'aimerais créer une liste de fractions, mais ça ne marche pas comme je veux.
Si je code par exemple ceci :
A=[ ]
for i in range(1,5):
   A.append(i/4)
Quand je fais print(A), j'obtiens la liste [0.25 , 0.5 , 0.75 , 1.0]
Si je code maintenant ceci :
from fractions import Fraction
B=[ ]
for i in range(1,5):
   B.append(Fraction(i,4))
Quand je fais print(B), j'obtiens la liste [Fraction(1,4)  , Fraction(1,2) , Fraction(3,4) , Fraction(1,1)]
Par contre, pour obtenir littéralement la liste "[1/4, 2/4, 3/4, 4/4]" ou "[1/4, 1/2, 3/4, 1/1]" ou "[1/4, 1/2, 3/4, 1]", aucune idée.
Comment fait-on ?

Réponses

  • Je ne comprends pas ta question. Ca veut dire quoi 1/4 pour toi dans Python?
  • Modifié (1 May)
    print(*B)
  • Modifié (1 May)
    Il manque les virgules, raoul.S et ça ne renvoie pas une chaîne ou une liste :
    [str(f) for f in L]
    ou :
    list(map(str,L))
    Pour avoir une liste et pour avoir une chaîne :
    str([str(f) for f in L])
    ou :
    str(list(map(str,L)))
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Modifié (1 May)
    Bonjour.
    N'y a-t-il pas un module de calcul formel, dans Python ??
    Cordialement.
    NB : les outils de base du calcul formel écrivent directement les fractions simplifiées.
  • Modifié (1 May)
    Si c'est juste un problème d'affichage de la fraction, c'est vraiment anecdotique : @raoul.S et @nicolas.patrois ont déjà répondu.
    Le module "fractions" fait toutes les opérations utiles pour des fractions : elles se manipulent exactement comme les entiers. On peut les additionner, les multiplier, les diviser, elles sont automatiquement simplifiées. En plus, comme c'est du Python, leurs numérateurs et dénominateurs sont des entiers qui n'ont aucune limite de taille.
    On peut même calculer des fractions dont le dénominateur est restreint et qui sont "suffisamment proches" d'un nombre donné.
    La question est donc : pour quelle raison as-tu besoin que les fractions s'écrivent ainsi ? Qu'est-ce qui ne te satisfait pas ?
  • Dans le ventre du python, non, mais il y a des bibliothèques disponibles. Cependant, pour écrire des fractions, c'est enfoncer un clou au marteau pneumatique (des profesionnels le font peut-être, dans la bâtiment…)
    Comme sous-entendu dans la première réponse, H. Topi, tu sembles confondre le type fraction, la représentation par le programme de ce que nous entendons par une fraction (ou un rationnel ? À toi de préciser ton besoin) avec son affichage en tant que chaîne de caractères par le programme. En utilisant le caractère « / », tu dis à Python de faire un calcul, il n'y a pas de raison pour qu'il produise une fraction en général.
  • Modifié (1 May)
    Houlà ! Beaucoup de réponses. Merci à vous.
    J'explique un peu le contexte. J'essaie de me réapprendre le Python (je pourrais dire apprendre, vu comment étaient les cours à l'université...) et j'avais envie de coder moi-même un algorithme de développement en fractions continuées. Je précise : je me doute qu'il existe des algos tous faits pour ça, mais ça ne m'apprendra rien de les utiliser. Mon objectif est d'obtenir une fonction $f(x,n)$ qui donne les $n$ premières fractions dans le développement de $x$, sous forme de liste. Donc par exemple $f(\pi,3)=\Big(3, \dfrac{22}{7},\dfrac{355}{113}\Big)$.
    Je veux une liste lisible juste "pour une utilisation ergonomique". La proposition de raoul ne donne pas une liste "sous forme de liste Python" mais ça reste une liste pour l'utilisateur humain. Pour mon utilisation, l'affichage "3 22/7 335/113" est mieux que "[3, Fraction(22,7) , Fraction(335,113)]". Bon, dans l'absolu, je n'en ai pas besoin, l'affichage Fraction(a,b) me donne toute l'information, mais si je demande 10 étapes, la version de raoul tient en une ligne au lieu de 3-4. C'est plus lisible.
    Je vais regarder un peu tout ce qui a été dit, visiblement le module "fractions" donne plein de fonctionnalités utiles que je ferais bien de savoir utiliser.
    Je vais avoir besoin de temps, évidemment si quelqu'un répond maintenant, je vais en tenir compte, mais essayez de ne pas me surcharger d'informations :D
  • La liste des fractions est-elle uniquement vouée à l'affichage ou comptes-tu l'utiliser pour faire des calculs ?
  • Modifié (1 May)
    En fait, ça dépend. Si j'arrive à coder une fonction qui me donne tout de suite la liste de fractions, alors c'est uniquement de l'affichage que je veux. Si j'ai besoin de coder des fonctions intermédiaires qui doivent manipuler des fractions, alors évidemment je devrai faire faire des calculs de fractions à mon programme.
    Pour l'instant, ce que j'ai, c'est une fonction de $(x,n)$ qui donne les $n$ premiers coefficients entiers dans le développement en fraction continue de $x$. Donc pour $\pi$, elle donne la liste $3, 7, 15, 1...$ J'avais l'intention de bidouiller un truc qui prend, pour tout $k$, le $k$-ième entier de la liste, l'inverse, l'ajoute au précédent, inverse le résultat, et rebelote. Donc qui rendrait directement la liste $3, 22/7, 335/113...$ à partir de la liste $3, 7, 15, 1...$ pour $\pi$. Si j'arrive à faire ça, je veux juste un affichage clair et concis du résultat final de cette fonction. Dans la fonction elle-même, si c'est mieux de charger tel ou tel module pour pouvoir faire des calculs de fractions, ça ne me pose aucun problème. Mais la liste finale $3, 22/7, 335/113...$ ne va pas me servir pour d'autres calculs après, l'objectif c'est vraiment juste la liste de fractions.   
  • À partir de ça, tu devrais obtenir des trucs avec ton algorithme, sans passer par une liste externe :
    >>> from math import pi
    >>> Fraction(pi)
    Fraction(884279719003555, 281474976710656)

    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Modifié (1 May)
    import sympy as sy
    a=sy.Rational(3,6)
    b=sy.Rational(4,16)
    a+b

    Affiche $\dfrac{3}{4}$

  • Sous forme de fraction à étage ?
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Modifié (2 May)
    Pour afficher directement la liste B, sous forme de fraction posée et avec les séparateurs que sont les virgules, on peut aussi écrire :
    print(*B, sep=", ")
    Ah, et aussi : il y a toujours quelqu'un qui a déjà fait le boulot https://pypi.org/project/ContFrac/
  • Pour faire des mathématiques, Sage est quand même bien mieux équipé que Python tout nu ! Pour reprendre l'exemple de départ...
    sage: A=[]
    ....: for i in range(1,5):
    ....:    A.append(i/4)
    ....:    
    sage: A
    [1/4, 1/2, 3/4, 1]
    

  • Modifié (2 May)
    nicolas.patrois a écrit :
    Sous forme de fraction à étage ?

    Calculer

    $3+\dfrac{3}{1+\dfrac{1}{3+\dfrac{1}{3}}}$

    import sympy as sy
    
    3 + sy.Rational(3, 1 + sy.Rational(1, 3 + sy.Rational(1, 3)))

    Affiche $\dfrac{69}{13}$

  • Ou plutôt...
    >>> import sympy as sy
    >>> 
    >>> 3 + sy.Rational(3, 1 + sy.Rational(1, 3 + sy.Rational(1, 3)))
    69/13
    

    Je persiste à préférer ce qui suit...
    sage: 3+3/(1+1/(3+1/3))
    69/13
    

  • Modifié (2 May)
    @Math Coss,
    Je ne vois pas la différence entre mon expression Python et la tienne.
    [$69/13$ vs $\dfrac{69}{13}$. :)  AD]
  • Ni fractions ni sympy n’affichent des fractions à étages comme $\LaTeX$.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Pour enfoncer le clou, Sage peut fournir du $\rm\LaTeX$.
    sage: latex(3+3/(1+1/(3+1/3)))
    \frac{69}{13}

  • Sympy affiche du LaTeX (donc les fractions "à étages") dans une feuille Jupyter Notebook.
  • Modifié (3 May)
    Ce n'est pas ce que je constate mais c'est de toute façon secondaire. Avec Sage, pour les choses simples, les nombres usuels sont implémentés nativement et on les invoque de la façon la plus simple (69/13 et pas sy.Rational(69,13) ou Fraction(69,13)). Pour les choses plus complexes, Sage est mieux fourni que Python puisqu'il contient Python et tout un tas de logiciels spécialisés en prime.

  • Modifié (3 May)

    Wilfrid a écrit :

    Je ne vois pas la différence entre mon expression Python et la tienne.

    [$69/13$ vs $\dfrac{69}{13}$. AD]

    $\dfrac{69}{13}$ n'est pas du Latex, c'est ce qu'affiche ma version de Jupyter Notebook (6.2.0) :

    héhéhé a écrit :

    Sympy affiche du LaTeX (donc les fractions "à étages") dans une feuille Jupyter Notebook.

    Ce n'est pas ce que je constate non plus. Si je remplace la fraction la plus profonde ($\frac{1}{3}$) par $\frac{1}{k}$, j'ai droit à un message d'erreur.

  • Modifié (3 May)
    Chez moi si, et sur les dizaines d'ordinateurs de mes collègues et étudiants.


    C'est bien du LaTeX, en faisant un clic droit sur la fraction et en réglant l'option math render: plain source:

    On peut aussi faire latex(expression) pour obtenir le code LaTeX correspondant.

  • Modifié (3 May)
    C'est exactement ce que je viens de dire. Ça dépend apparemment de la version du Jupyter Notebook, ou peut-être du type d'installation (ma version est une extension de Visual Studio Code).
    Je pensais que tu parlais de l'affichage d'une expression comme celle que j'ai postée dans ce message.
  • Encore une fois, la question de LaTeX est annexe. Pour les mathématiques, il est dommage de réinventer les types de base à chaque utilisation et de les manipuler avec une syntaxe lourde. Idem pour les graphiques.
  • Pour afficher des fractions continues avec Sympy, une solution est proposée ici.

    Il est possible aussi de configurer Sympy pour qu'il accepte directement les fractions et les symboles sans avoir besoin de les déclarer. 


  • Intéressant. Sébastien Labbé est un des développeurs et promoteurs de Sage, pourtant il se contente de sympy en cours.
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!