Bonjour,
J'ai une chaine de caractere de ce type:
pinout_eat_pec :"PACKVDD=vdd gnd=PACKGND";
et je voudrais en déduire que PACKVDDest bien égale à vdd et idem pour PACKGND.....
Bonjour,
J'ai une chaine de caractere de ce type:
pinout_eat_pec :"PACKVDD=vdd gnd=PACKGND";
et je voudrais en déduire que PACKVDDest bien égale à vdd et idem pour PACKGND.....
Bonsoir,
Une des méthodes serait la suivante:
L'autre consisterait en l'utilisation des expressions regulières (c'est pas ma tasse de thé).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 txt = "PACKVDD=vdd gnd=PACKGND" ens = txt.split(" ") res = [i.split("=") for i in ens] dres = dict(res) print res print dres
A +
soit c'est trop précis est ce qui suit est une solution ...
soit la question(ou le problème) n'est pas assez "générale".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 txt = "PACKVDD=vdd gnd=PACKGND" "PACKVDD=vdd" in txt "gnd=PACKGND" in txt
on manque d'info quoi...
Pourrais-tu confirmer la logique suivante :
- dans la(les) chaîne(s) il y a une ou plusieurs égalités sur une même ligne
- chacune de ces égalités comporte un nom en majuscules et un nom en minuscule
- chacune de ces parties de l'égalité peuvent être placés indifféremment d'un côté ou de l'autre du signe =
- la partie minuscule d'une égalité doit être les trois dernière lettres de l'autre partie en majuscule
Si telle est bien la logique, ceci fonctionne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 >>> def valid(txt): check = lambda names: names[0].islower() and names[1].isupper() and names[0]==names[1][-3:].lower() for names in (egal.split('=') for egal in txt.split()): if check(names) or check(names[::-1]): yield set(names) >>> txt="PACKVDD=vdd gnd=PACKGND BIDON=foo" >>> list(valid(txt)) [set(['PACKVDD', 'vdd']), set(['gnd', 'PACKGND'])]
oui N.Tox ta logique est bonne mais ton programme ne fais pas exactement se que je veux......J'aimerais faire correspondre par exemple PACKVDD à vdd mais la c'est pas possible puisque j'ai une fois PACKVDD à gauche et une autre fois PACKGND à droite...
afranck64 ton programme marche bien et j'ai en sorti le dictionnaire suivant:
{'PADVDD': 'vdd', 'gnd': 'PADGND'}
mais j'aimerais plutot obtenir cela afin de pouvoir exploiter ce dico:
{'PADVDD': 'vdd', 'PADGND': 'gnd'}
Salut,
pour le code que j'obtiens:
Mais je te conseille de t'assurer que tu ne peux pas faire autrement. Un meilleur ordonancement des éléments lors de la formation de la liste ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 txt = "PACKVDD=vdd gnd=PACKGND" ens = txt.split(" ") res = [] for i,elt in enumerate(ens): if i%2==0: res.append(elt.split("=")) else: res.append(reversed(elt.split("="))) dres = dict(res) print res print dres
C'est toujours plus compliqué de rectifier le tir après.
j'utilise ce code qui marche bien :
bon c'est pas ce qui a de plus élégant comme programme mais sa a le mérite de faire ce que je veux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 txt = "PACKVDD=vdd gnd=PACKGND" ens = ens.strip().split() res = [i.split("=") for i in ens] for elem in res: if elem[0] == pad: return elem[1] elif elem[1] == pad: return elem[0]
les résultats envoyé par la fonction que je t'ai proposée sont des set, ces dernier n'ont pas d'ordre, il suffit donc de créer une fonction qui traite ces set pour retourner un résultat ordonné à ta convenance
En fait, dans ce cas précis, yielder des sets n'apporte strictement rien .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 >>> def valid(txt): check = lambda names: names[0].islower() and names[1].isupper() and names[0]==names[1][-3:].lower() for names in (egal.split('=') for egal in txt.split()): if check(names) or check(names[::-1]): yield set(names) >>> def get_valid_equalities_as_dict(txt): return dict([sorted(s,key=str.isupper,reverse=True) for s in valid(txt)]) >>> txt="PACKVDD=vdd gnd=PACKGND BIDON=foo" >>> get_valid_equalities_as_dict(txt) {'PACKVDD': 'vdd', 'PACKGND': 'gnd'}
Remplacer donc la ligne
s’avérera plus efficace
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 yield set(names) #par yield names
EDIT:
Ou bien au lieu de faire une deuxième fonction, adapter la première en un condensé:
- version_longue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 >>> def valid_equalities(txt): check = lambda names: names[0].islower() and names[1].isupper() and names[0]==names[1][-3:].lower() for names in (egal.split('=') for egal in txt.split()): if check(names) or check(names[::-1]): return sorted(names, key=str.isupper, reverse=True) >>> dict(valid_equalities(txt)) {'PACKVDD': 'vdd', 'PACKGND': 'gnd'}- version_courte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 >>> def valid_equalities(txt): check = lambda names: names[0].islower() and names[1].isupper() and names[0]==names[1][-3:].lower() return (sorted(names, key=str.isupper, reverse=True) for names in (egal.split('=') for egal in txt.split()) if check(names) or check(names[::-1])) >>> dict(valid_equalities(txt)) {'PACKVDD': 'vdd', 'PACKGND': 'gnd'}
Salut,
@Kali38
Avec mon dernier code je suppose que les groupes a indice pair sont bien ordonne et ceux a indices impair ne le sont pas.
Celui de N.Tox, je pense tiens compte du fait que les groupes debutants par des majuscules le sont, et les autres non.
@N.Tox
Je ne comprends pas dans ton code a quel moment la selection du troisieme groupe est rejetee.
>>> txt="PACKVDD=vdd gnd=PACKGND BIDON=foo"
>>> get_valid_equalities_as_dict(txt)
{'PACKVDD': 'vdd', 'PACKGND': 'gnd'}
grâce à la fonction suivante, plus particulièrement le passage en rouge:
mais si le mot en maj doit toujours commencer par 'PACK', alors faut remplacer cette fonction par celle-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part check = lambda names: names[0].islower() and names[1].isupper() and names[0]==names[1][-3:].lower()
Code : Sélectionner tout - Visualiser dans une fenêtre à part check = lambda names: names[0].islower() and names[1].isupper() and names[1]=='PACK'+names[0].upper() and len(names[0])==3
Partager