Problème mathématique

Fermé
benbenx9 Messages postés 1 Date d'inscription jeudi 16 février 2017 Statut Membre Dernière intervention 16 février 2017 - 16 févr. 2017 à 19:33
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 23 févr. 2017 à 10:39
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 :

#!/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:

1 réponse

mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 7 802
Modifié par mamiemando le 23/02/2017 à 10:53
Bonjour,

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
0