Ecriture d'un ensemble L2 indépendant des éléments de L1

Andri - 24 juil. 2017 à 19:06
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Derniè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:
L2={'e1+e2','e1+'e2'*e3^e4+e5+e6','e4+e5+e6^e1+e2','e4+e5+e6'}


Pour faire cela, j'ai utiliser le code suivant:

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:
 L1={'LossOfBrakingCommands','Systems1And2DoNotOperate','LossOfSystem1','LossOfSystem2','SwitchFailure','SwitchFailsInPosition1AndSystem1Fails' ,'SwitchFailsInPosition2AndSystem2Fails'}

et

L2={'Systems1And2DoNotOperate*SwitchFailure*ValidityMonitorFailure','LossOfSystem1+LossOfSystem2','System1ElectronicFailure*LossOfSystem1PowerSupply','System2ElectronicFailure*LossOfSystem2PowerSupply'
,'SwitchFailsInPosition1AndSystem1Fails*SwitchFailsInPosition2AndSystem2','Fails*SwitchStuckInIntermediatePosition','LossOfSystem1+SwitchStuckInPosition1','LossOfSystem2+SwitchStuckInPosition2'}

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

3 réponses

didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
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)


@+
0
tantelititana
1 août 2017 à 12:46
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.
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
1 août 2017 à 13:04
Salut,

Tu peux utiliser les expressions régulière pour casser chaque élément en cours et vérifier s'il match avec un élément de ta liste L1:

import re

e2_splitted = re.findall(r"[\w']+", e2)
if e1 in e2_splitted:
    # ...
0
Rejoignez-nous