Problème mathématique
Bonjour à tous,
Pour commencer, je suis sur python2.7 et Windows 10. Je précise ne pas être un expert en python, mais je trouve cet outil vraiment passionnant.
J'ai donc un fichier texte qui se présente comme ceci:
1 2 1 3 2 3 4 2 4 5 2 5 3 2 3 4 2 4 6 7 6 8 7 8 5 2 5 8 2 8 5 7 5 4 7 4 2 6 2 8 6 8 7 5 7 8 5 8 7 3 7 4 3 4 1 6 1 2 6 2 3 6 3 1 6 1 3 7 3 6 7 6
Mon but est de savoir si il y a des doublons normal ou inversés dans cette suite en regroupant les nombres deux par deux. Je m'explique, en prenant les 7 premiers termes regroupés par exemple, on a 12, 13, 23, 42, 45, 25 et 32, or, pour moi, 23 est identique à 32, je souhaiterai donc supprimer le terme 32.
J'ai codé ceci :
J'ai donc évidement l'erreur :
Pour le coup je suis un peu bloqué, en plus, je me suis lancé dans quelque-chose d'assez complexe en traitant chaque nombre comme un contenu.
Quelqu'un aurait-il une idée?
Merci par avance.
Ben
Pour commencer, je suis sur python2.7 et Windows 10. Je précise ne pas être un expert en python, mais je trouve cet outil vraiment passionnant.
J'ai donc un fichier texte qui se présente comme ceci:
1 2 1 3 2 3 4 2 4 5 2 5 3 2 3 4 2 4 6 7 6 8 7 8 5 2 5 8 2 8 5 7 5 4 7 4 2 6 2 8 6 8 7 5 7 8 5 8 7 3 7 4 3 4 1 6 1 2 6 2 3 6 3 1 6 1 3 7 3 6 7 6
Mon but est de savoir si il y a des doublons normal ou inversés dans cette suite en regroupant les nombres deux par deux. Je m'explique, en prenant les 7 premiers termes regroupés par exemple, on a 12, 13, 23, 42, 45, 25 et 32, or, pour moi, 23 est identique à 32, je souhaiterai donc supprimer le terme 32.
J'ai codé ceci :
#!/usr/bin/python # -*- coding: iso-8859-1 -*- contenu = open("E:\Desktop\ScriptPython\Reducemesh\POBJ\Granulat1-8.txt", "r").read() contenu = contenu.split("z") fichier = open('E:\Desktop\ScriptPython\Reducemesh\POBJ\Granulat1-9.txt', 'w') # 71 contenu en tout k=0 for j in range (0, 68-k): # contenu 70 et 71 auront deja ete verifie en fin de chaine for i in range (2, 70-k-j): #permet de reduire l'intervalle en fonction que 'j' grandit if contenu[j]+contenu[j+1] == contenu[j+i]+contenu[j+(i+1)]: del contenu[j+i] del contenu[j+i] k=k+2 #reduit l'intervalle a chaque contenu supprime elif contenu[j+1]+contenu[j] == contenu[j+i]+contenu[j+(i+1)]: del contenu[j+i] del contenu[j+i] k=k+2 elif contenu[j]+contenu[j+1] == contenu[j+(i+1)]+contenu[j+i]: del contenu[j+i] del contenu[j+i] k=k+2 elif contenu[j+1]+contenu[j] == contenu[j+(i+1)]+contenu[j+i]: del contenu[j+i] del contenu[j+i] k=k+2 i=i+2 j=j+2 print contenu
J'ai donc évidement l'erreur :
"if contenu[j]+contenu[j+1] == contenu[j+i]+contenu[j+(i+1)]: IndexError: list index out of range"
Pour le coup je suis un peu bloqué, en plus, je me suis lancé dans quelque-chose d'assez complexe en traitant chaque nombre comme un contenu.
Quelqu'un aurait-il une idée?
Merci par avance.
Ben
A voir également:
- Problème mathématique
- Formule mathématique - Télécharger - Études & Formations
- Logiciel écriture mathématique gratuit - Télécharger - Vie quotidienne
- Clavier symbole mathématique - Guide
- Clavier mathématique iphone - Guide
- Logiciel mathématique gratuit - Télécharger - Sciences & Techniques
1 réponse
Bonjour,
J'aurais dit un truc dans ce genre
Note que dans ce code, si le nombre de valeurs dans la liste est impair, la dernière valeur est ignorée.
Résultat :
Note aussi que la complexité peut être améliorée. Ici le programme est en O(n^2) si n est la taille de la liste, or tu peux réaliser la même chose en juste deux passes (donc en O(n)).
https://fr.wikipedia.org/wiki/Th%C3%A9orie_de_la_complexit%C3%A9_(informatique_th%C3%A9orique)
Il suffit lors de la première passe de repérer les doublons, puis dans la seconde de reconstruire
Bonne chance
J'aurais dit un truc dans ce genre
#!/usr/bin/env python
def pairs_from_values(values):
pairs = list()
for i in range(len(values) / 2):
if 2 * i + 1 < len(values):
pairs.append((int(values[2 * i]), int(values[2 * i + 1])))
return pairs
content = "1 2 1 3 2 3 4 2 4 5 2 5 3 2 3 4 2 4 6 7 6 8 7 8 5 2 5 8 2 8 5 7 5 4 7 4 2 6 2 8 6 8 7 5 7 8 5 8 7 3 7 4 3 4 1 6 1 2 6 2 3 6 3 1 6 1 3 7 3 6 7 6"
values = content.split()
pairs = pairs_from_values(values)
sanitized_pairs = [(i, j) for (i, j) in pairs if (j, i) not in pairs]
print(sanitized_pairs)
Note que dans ce code, si le nombre de valeurs dans la liste est impair, la dernière valeur est ignorée.
Résultat :
(mando@velvet) (~) $ ./pair.py
[(1, 2), (3, 4), (6, 8), (7, 8), (5, 8), (2, 8), (7, 4), (2, 8), (6, 8), (7, 8), (5, 8), (7, 4), (3, 4), (1, 2), (3, 6), (3, 6)]
Note aussi que la complexité peut être améliorée. Ici le programme est en O(n^2) si n est la taille de la liste, or tu peux réaliser la même chose en juste deux passes (donc en O(n)).
https://fr.wikipedia.org/wiki/Th%C3%A9orie_de_la_complexit%C3%A9_(informatique_th%C3%A9orique)
Il suffit lors de la première passe de repérer les doublons, puis dans la seconde de reconstruire
sanitized_pairs. Note enfin qu'en programmation itérer sur un container (ici la liste) qu'on supprime/ajoute des éléments est une mauvaise idée, car en général les itérateurs sont invalidés. C'est pour cela qu'une seconde passe est a priori nécessaire.
Bonne chance