Ecriture d'un ensemble L2 indépendant des éléments de L1
Andri
-
24 juil. 2017 à 19:06
didoux95
Messages postés845Date d'inscriptionmardi 25 avril 2006StatutMembreDernière intervention 1 août 2017
-
1 août 2017 à 13:04
Bonjour tout le monde.
En fait la je suis entrain de travailler avec deux fichier que je nomme L1 et L2. Tel que les deux fichiers peuvent être considérer comme deux ensembles
en bijection.
Exemple: et
L1={'g1','g2','g3','g4'}
et
L2={'e1+e2','g1*e3^g4','g4^g1','e4+e5+e6'}
Le but est d'écrire les éléments de L2 sans les éléments de L1.
pour un indice i dans {1,2,3,4} on a que L1[i]=L2[i], exemple L[1]='g1'='e1+e2'.
Comme L2[1]='g1' et L2[4]='g4' ne sont plus en fonction d'autres éléments de L1 donc on ne louchent plus.
Donc le prochain travail à faire est de remplacer les éléments de L1 qui expriment L2[2]='g2'='g1*e3^g4' et L2[3]='g3'='g4^g1'. Ce qui nous donne. L2[2]='e1+e2'*e3^e4+e5+e6' et L2[3]='e4+e5+e6^e1+e2'.
Ce qui nous donne:
import os import string import sys if len(sys.argv)<3: print"Usage:python this-program input-file" sys.exit(1) else: # On entre en argument deux fichier L1 et L2 # D'abord il faut entrer L1 en suite L2 input=sys.argv[1] file1= sys.argv[2] sys.setrecursionlimit(10000)
# On ouvre les fichier L1.txt et L1.txt def copy_file_to_py(file): f=open(file,'r') List=[] for l in f: List.append(l.rstrip()) f.close() return List #On verifie si g_i est dans une chaine de caratere donnee
def check_list(List,string): j=0 while j<len(List): if List[j] in string: return 0 else: j+=1 return 1
#On elimine les portes g_i au fur et a mesure def eliminer_porte(List1,List2):
gateL1=[] gateL2=[] U1=[] U2=[] for i in range(len(List2)): if check_list(List1,List2[i]): gateL1.append(List1[i]) gateL2.append(List2[i]) else: U1.append(List1[i]) U2.append(List2[i]) #On enleve les elements qui en contienent pas L1[i] dans L2] # Et pour gadrer la bijection on retir aussi l'elements dans # L1 qui corréspond. List1=U1 List2=U2 for i in range(len(List2)): if not(check_list(gateL1,List2[i])): for j in range(len(gateL1)): if gateL1[j] in List2[i]: List2[i]=List2[i].replace(gateL1[j],gateL2[j])
if len(List2)==1: f=open('resultat.txt','w') f.write(List2[0]) f.close() return 0 else: #Si la longueur de la List2 est>1 on réitaire la procédure. eliminer_porte(List1,List2)
if __name__=='__main__': List1=[] List2=[] gate_check=[] List1=copy_file_to_py(input) List2=copy_file_to_py(file1) eliminer_porte(List1,List2)
Le problème par rapport à ce code est que quand j'utilise des ensembles avec des mots plus long, le programme ne s'arrête pas. Par exemple si
on définit:
Mon code ne marche pas ,ce qui est problématique pour moi.
Donc je demande votre aide si le vous paît.
PS: Est ce que vous pouvez aussi m'indiquer comment on insert des fichiers sur le forum?
Merci au tous
A voir également:
Ecriture d'un ensemble L2 indépendant des éléments de L1
didoux95
Messages postés845Date d'inscriptionmardi 25 avril 2006StatutMembreDernière intervention 1 août 20172 1 août 2017 à 12:20
Salut,
Le problème ne semble pas provenir de ton algo, mais plutôt de tes ensembles. Exécute le scripte suivant.
#!/usr/bin/python
import sys
def main():
# example 1: ok (1 step)
l1 = ['g1','g2','g3','g4']
l2 = ['e1+e2','g1*e3^g4','g4^g1','e4+e5+e6']
# example 2: nok (>10 steps)
l1 = ['LossOfBrakingCommands','Systems1And2DoNotOperate','LossOfSystem1','LossOfSystem2','SwitchFailure','SwitchFailsInPosition1AndSystem1Fails' ,'SwitchFailsInPosition2AndSystem2Fails']
l2 = ['Systems1And2DoNotOperate*SwitchFailure*ValidityMonitorFailure','LossOfSystem1+LossOfSystem2','System1ElectronicFailure*LossOfSystem1PowerSupply','System2ElectronicFailure*LossOfSystem2PowerSupply','SwitchFailsInPosition1AndSystem1Fails*SwitchFailsInPosition2AndSystem2','Fails*SwitchStuckInIntermediatePosition','LossOfSystem1+SwitchStuckInPosition1','LossOfSystem2+SwitchStuckInPosition2']
print "cleaning .."
max_step_count = 5
i = 0
isclean = False
while (i<=max_step_count and not isclean):
print "pass "+str(i)
[isclean, nbreplacement, l1, l2] = clean(l1, l2)
print " > replaced "+str(nbreplacement)+" element(s)\n"
i = i + 1
if (isclean):
print "done"
print l1
print l2
else:
print "failed"
def clean(l1, l2):
# perform replacement
nbreplacement = 0
i2 = 0
for e2 in l2:
i1 = 0
for e1 in l1:
if e1 in e2:
print " + replacing part of e2("+str(i2)+") with e2("+str(i1)+")"
e2 = e2.replace(l1[i1], "("+l2[i1]+")")
l2[i2] = e2
nbreplacement = nbreplacement + 1
i1 = i1 + 1
i2 = i2 + 1
# check whether the replaced items still contain data that
# can be replaced
isclean = True
i2 = 0
for e2 in l2:
i1 = 0
for e1 in l1:
if e1 in e2:
isclean = False
i1 = i1 + 1
i2 = i2 + 1
# return current step result
return [isclean, nbreplacement, l1, l2]
if __name__ == "__main__":
sys.exit(main())
Comme les logs générés l'indiquent, tes listes L1 et L2 ne te permettent d'obtenir ce que tu veux en un nombre finis d'étape.. En fait, pour ton second exemple de liste: jamais!
cleaning ..
pass 0
+ replacing part of e2(0) with e2(1)
+ replacing part of e2(0) with e2(2)
+ replacing part of e2(0) with e2(3)
+ replacing part of e2(0) with e2(4)
+ replacing part of e2(0) with e2(5)
+ replacing part of e2(1) with e2(2)
+ replacing part of e2(1) with e2(3)
+ replacing part of e2(2) with e2(2) <<< ICI TU AS DES PROBLÈMES
+ replacing part of e2(3) with e2(3)
+ replacing part of e2(4) with e2(5)
+ replacing part of e2(6) with e2(2)
+ replacing part of e2(7) with e2(3)
> replaced 12 element(s)
pass 1
+ replacing part of e2(0) with e2(2) <<< A CHAQUE FOIS QUE TU REMPLACERAS QQC PAR L'ELEMENT (2) IL Y AURA UNE NOUVELLE PASSE NECESSAIRE .. RECURSSIVITE INFINIE :o
+ replacing part of e2(0) with e2(3)
+ replacing part of e2(1) with e2(2)
+ replacing part of e2(1) with e2(3)
+ replacing part of e2(2) with e2(2)
+ replacing part of e2(3) with e2(3)
+ replacing part of e2(6) with e2(2)
+ replacing part of e2(7) with e2(3)
> replaced 8 element(s)
pass 2
+ replacing part of e2(0) with e2(2)
+ replacing part of e2(0) with e2(3)
+ replacing part of e2(1) with e2(2)
+ replacing part of e2(1) with e2(3)
+ replacing part of e2(2) with e2(2)
+ replacing part of e2(3) with e2(3)
+ replacing part of e2(6) with e2(2)
+ replacing part of e2(7) with e2(3)
> replaced 8 element(s)
Merci pour ta réponse, je crois avoir trouvé le problème. En fait, dans un éléments de l'ensemble L2, par exemple on va prendre
L2={'e1*e3','g1+g2*','g1+e11*g111'}
Dans le troisième élément de L2 si on veut remplacer 'g1' par par exemple 'e1*e3', le code va aussi remplacer dans g111, c'est-à-dire
que le code va remplacer g111 par e1*e311. Donc on va avoir que:
L2={'e1*e3','g1+g2*','e1*e3+e11*e1*e311'}
Ce qui n'est pas ce qu'il faut. Si quelqu'un connaît une façon de faire pour remplacer correctement les choses comme il faut , ça m'aidera vraiment à avancer sur ce point. Je vous remercie pour vos commentaire et vos aides.