Occurence commençant par une variable - Python
Florian
-
dachiasse Messages postés 1932 Statut Membre -
dachiasse Messages postés 1932 Statut Membre -
Bonjour,
Je suis débutant sur Python et je souhaiterai finaliser le code sur lequel je travail, je sens que je touche au but mais je n'arrive pas à trouver l'erreur...
En bref, je souhaite créer un code me permettant de compter le nombre de chiffres commençant par le chiffre renseigné.
Une fois le nombre d'occurence total trouvé le renvoyer avec le numéro associé.
Ensuite, augmenter ce chiffre de +1 et calculer a nouveau le nombre d'occurence commençant par ce dernier chiffre.
Voici ce que j'ai commencé à faire :
Le résultat que j'obtiens :
39 , 4
40 , 0
41 , 0
42 , 0
43 , 0
44 , 0
45 , 0
46 , 0
47 , 0
48 , 0
49 , 0
Le résultat souhaité :
39 , 4
40 , 3
41 , 8
42 , 3
43 , 1
44 , 0
45 , 2
46 , 9
47 , 11
48 , 4
49 , 7
Merci d'avance.
Je suis débutant sur Python et je souhaiterai finaliser le code sur lequel je travail, je sens que je touche au but mais je n'arrive pas à trouver l'erreur...
En bref, je souhaite créer un code me permettant de compter le nombre de chiffres commençant par le chiffre renseigné.
Une fois le nombre d'occurence total trouvé le renvoyer avec le numéro associé.
Ensuite, augmenter ce chiffre de +1 et calculer a nouveau le nombre d'occurence commençant par ce dernier chiffre.
Voici ce que j'ai commencé à faire :
fh = open("file.txt")
fhread = fh.readlines()
with open("file.txt") as fh:
number = 39
occurrences = 0
while number < 50:
findz = str(number)
for line in fh:
findz = str(number)
if line.startswith(findz): occurrences +=1
print(findz, ",", occurrences)
number = number +1
occurrences = 0
Configuration: Macintosh / Safari 13.1.2
Le résultat que j'obtiens :
39 , 4
40 , 0
41 , 0
42 , 0
43 , 0
44 , 0
45 , 0
46 , 0
47 , 0
48 , 0
49 , 0
Le résultat souhaité :
39 , 4
40 , 3
41 , 8
42 , 3
43 , 1
44 , 0
45 , 2
46 , 9
47 , 11
48 , 4
49 , 7
Merci d'avance.
| EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI Merci d'y penser dans tes prochains messages. |
A voir également:
- Occurence commençant par une variable - Python
- Citizen code python avis - Accueil - Outils
- Numero commencant par 0806 - Guide
- Ce programme est écrit en python. il construit un mot secret dans une variable mais il ne l'affiche pas. modifiez-le pour qu'il affiche le mot secret. exécutez-le. quel est ce mot secret? ✓ - Forum Python
- Vba excel sélectionner une plage de cellules variable ✓ - Forum VB / VBA
- Python pix ✓ - Forum Python
4 réponses
Salut,
J'essaye, mais, vraiment j'essaye. J'ai RIEN compris !
"compter le nombre de chiffres commençant par le chiffre renseigné"
par exemple : 654125 : chiffre renseigné 1 : résultat 3 chiffres (125) ?
J'essaye, mais, vraiment j'essaye. J'ai RIEN compris !
"compter le nombre de chiffres commençant par le chiffre renseigné"
par exemple : 654125 : chiffre renseigné 1 : résultat 3 chiffres (125) ?
Bonjour,
Désolé on va faire passer ça sur le coup de la fatigue.
En soit je recherche dans un fichier (file.txt) qui contient :
3954
3240
4345
4041
3834
4023
Les chiffres de ce fichier, commençant par 39 soit pour cet exemple il y a 1 occurence.
Ensuite je voudrais faire une loop pour dire à mon code ok, on a vu que les chiffres commençant par 39 il y en à 1 mais combien y en a t-il qui commence par 40, le code repars et me sort cette fois-ci : 2 occurrences.
Pour que le résultat final soit :
39, 1
40, 2
41, 0
42, 1
43, 1
Explication :
Il y a 1 ligne commençant par 39 sur tout le fichier, une fois finit j'ajoute +1 à mon 39 nous avons maintenant 40 et le code tourne pour m'afficher son nombre d'occurence etc
J'espere avoir été un peu plus clair.
Merci
Désolé on va faire passer ça sur le coup de la fatigue.
En soit je recherche dans un fichier (file.txt) qui contient :
3954
3240
4345
4041
3834
4023
Les chiffres de ce fichier, commençant par 39 soit pour cet exemple il y a 1 occurence.
Ensuite je voudrais faire une loop pour dire à mon code ok, on a vu que les chiffres commençant par 39 il y en à 1 mais combien y en a t-il qui commence par 40, le code repars et me sort cette fois-ci : 2 occurrences.
Pour que le résultat final soit :
39, 1
40, 2
41, 0
42, 1
43, 1
Explication :
Il y a 1 ligne commençant par 39 sur tout le fichier, une fois finit j'ajoute +1 à mon 39 nous avons maintenant 40 et le code tourne pour m'afficher son nombre d'occurence etc
J'espere avoir été un peu plus clair.
Merci
Ok, c'était l'autre idée que je me faisais mais à force de relecture, je me perdais.
Bon, c'est fourbe, ton code est logique mais il n'est pas correct en Python. Déjà, je reprends ton code avec la balise python :
Les lignes 1 et 2 sont inutiles, tu fais pareil ensuite et mieux avec with.
Je régule l'indentation (4 espaces pas 12 !) et je ne fais pas de if inline comme la ligne 13 :
Et, en fait, tu dois tester ton code. J'ai fait ça :
Voilà la méthode qui te manquait : https://docs.python.org/fr/3/library/io.html#io.IOBase.seek
Bon, c'est fourbe, ton code est logique mais il n'est pas correct en Python. Déjà, je reprends ton code avec la balise python :
fh = open("file.txt")
fhread = fh.readlines()
with open("file.txt") as fh:
number = 39
occurrences = 0
while number < 50:
findz = str(number)
for line in fh:
findz = str(number)
if line.startswith(findz): occurrences +=1
print(findz, ",", occurrences)
number = number +1
occurrences = 0
Les lignes 1 et 2 sont inutiles, tu fais pareil ensuite et mieux avec with.
Je régule l'indentation (4 espaces pas 12 !) et je ne fais pas de if inline comme la ligne 13 :
with open("file.txt") as fh:
number = 39
occurrences = 0
while number < 50:
findz = str(number)
for line in fh:
findz = str(number)
if line.startswith(findz):
occurrences +=1
print(findz, ",", occurrences)
number = number +1
occurrences = 0
Et, en fait, tu dois tester ton code. J'ai fait ça :
with open("file.txt") as fh:
number = 39
while number < 41:
for line in fh:
print(line)
number += 1 Logiquement, on doit voir afficher chaque ligne du fichier 2 fois. Or, ce n'est pas le cas, parce que for line in fh agit comme un générateur. Un générateur est un itérateur particulier qui ne se remet pas automatiquement à 0, il faut le faire explicitement.
Voilà la méthode qui te manquait : https://docs.python.org/fr/3/library/io.html#io.IOBase.seek
yg_be
Messages postés
24281
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 585
bonjour,
en général, il est plus performant de lire une seule fois le fichier et de compter simultanément toutes les occurrences, sur base d'un tableau de compteurs
en général, il est plus performant de lire une seule fois le fichier et de compter simultanément toutes les occurrences, sur base d'un tableau de compteurs
Salut,
Oui tu as raison. Maintenant, quand on met dans une variable (souvent une liste) le contenu d'un fichier, ce contenu va dans la mémoire vive. Si ça dépasse la quantité de mémoire vive disponible, ça va déstabiliser le programme et le faire échouer.
Dans le cas où ça ne pose pas de problème. Le mieux est, évidemment, de travailler dans la RAM et non la ROM qui est énormément plus lente.
Oui tu as raison. Maintenant, quand on met dans une variable (souvent une liste) le contenu d'un fichier, ce contenu va dans la mémoire vive. Si ça dépasse la quantité de mémoire vive disponible, ça va déstabiliser le programme et le faire échouer.
Dans le cas où ça ne pose pas de problème. Le mieux est, évidemment, de travailler dans la RAM et non la ROM qui est énormément plus lente.
Hey,
Au cas ou cela pourrait aider, j'ai réussi mon code :
Au cas ou cela pourrait aider, j'ai réussi mon code :
with open("file.txt") as fh:
number = 393901
occurrences = 0
lines=fh.readlines()
while number < 393941:
findz = str(number)
for line in lines:
if line.startswith(findz): occurrences +=1
print(findz, ",", occurrences)
number = number +1
occurrences = 0
fh.close()
Salut,
Si mon idée de remettre le curseur au début du fichier avec la méthode seek(), ton code n'est pas optimal.
Comme le suggère yg, tu pourrais mettre le contenu de ton fichier dans une liste et travailler dedans. Et si ton fichier est plus volumineux que ta RAM, tu découpes le contenu en morceaux plus petits.
Si mon idée de remettre le curseur au début du fichier avec la méthode seek(), ton code n'est pas optimal.
Comme le suggère yg, tu pourrais mettre le contenu de ton fichier dans une liste et travailler dedans. Et si ton fichier est plus volumineux que ta RAM, tu découpes le contenu en morceaux plus petits.
readlines() met, malheureusement, le contenu du fichier dans une liste.
au lieu d'utiliser readlines(), il est préférable, dans une boucle, d'utiliser readline().
il est en effet inutile, et contre-productif, de lire tout le fichier en mémoire.
je ne suggère pas de mettre le fichier en mémoire. je suggère de lire le fichier ligne par ligne, et, pour chaque ligne, d'incrémenter le compteur adéquat. ce qui implique d'utiliser une liste de compteurs.
au lieu d'utiliser readlines(), il est préférable, dans une boucle, d'utiliser readline().
il est en effet inutile, et contre-productif, de lire tout le fichier en mémoire.
je ne suggère pas de mettre le fichier en mémoire. je suggère de lire le fichier ligne par ligne, et, pour chaque ligne, d'incrémenter le compteur adéquat. ce qui implique d'utiliser une liste de compteurs.
Salut,
Je viens de relire attentivement ton message 8. Au début, je me demandais comment compter plusieurs occurrences sur une seule lecture du ficher. Maintenant, j'ai compris et eu la même idée de créer une liste de compteurs.
Et oui, dans ce cas, inutile de placer le contenu du fichier en RAM. De plus, je suppose que python place en RAM la ligne du readline() en cours de traitement.
Je viens de relire attentivement ton message 8. Au début, je me demandais comment compter plusieurs occurrences sur une seule lecture du ficher. Maintenant, j'ai compris et eu la même idée de créer une liste de compteurs.
Et oui, dans ce cas, inutile de placer le contenu du fichier en RAM. De plus, je suppose que python place en RAM la ligne du readline() en cours de traitement.