OVH Cloud OVH Cloud

Petit probleme a resoudre

11 réponses
Avatar
funtix
Salut,
j'aimerais trouver l'algo qui me permette de resoudre le probleme suivant.
Chaque personne donne ses couleurs preferees:

jean pierre paul jacques
-jaune -rouge -rouge -jaune
-vert -jaune -bleu
-bleu -bleu


Je voudrais l'algo qui permette (de facon elegante et pythonesque) de
construire l'arbre inverse qui serait :

jaune vert bleu rouge
- jean - jean - jean -pierre
- pierre - jacques -paul
- jacques - pierre

Le choix des structures est libre (dict, list, class)...

1 personne peut avoir autant de couleurs preferees qu'il veut.

Il peut y avoir un nombre indertermine de personne.

Avez vous une idee?

Merci

10 réponses

1 2
Avatar
funtix
J'oublier dans mon probleme en pratique les personnes sont des objets et
les couleurs egalement.

funtix wrote:
Salut,
j'aimerais trouver l'algo qui me permette de resoudre le probleme suivant.
Chaque personne donne ses couleurs preferees:

jean pierre paul jacques
-jaune -rouge -rouge -jaune
-vert -jaune -bleu
-bleu -bleu


Je voudrais l'algo qui permette (de facon elegante et pythonesque) de
construire l'arbre inverse qui serait :

jaune vert bleu rouge
-jean -jean -jean -pierre
-pierre -jacques -paul
-jacques -pierre

Le choix des structures est libre (dict, list, class)...

1 personne peut avoir autant de couleurs preferees qu'il veut.

Il peut y avoir un nombre indertermine de personne.

Avez vous une idee?

Merci


Avatar
Michel Claveau
Bonsoir !

Une façon de faire :

pref={}
pref['jean']=['jaune','vert','bleu']
pref['pierre']=['rouge','jaune','bleu']
pref['paul']=['rouge','bleu']
pref['jacques']=['jaune']

coul={}
for i,j in zip(pref,pref.values()):
for c in j:
coul.setdefault(c,[])
coul[c].append(i)

print '-'*55
print coul
print '-'*55
for i in coul:
print i,coul[i]
print '-'*55

--
@-salutations

Michel Claveau
Avatar
Michel Claveau
Un peu plus simple :

pref={}
pref['jean']=['jaune','vert','bleu']
pref['pierre']=['rouge','jaune','bleu']
pref['paul']=['rouge','bleu']
pref['jacques']=['jaune']

coul={}
for i in pref:
for c in pref[i]:
coul.setdefault(c,[])
coul[c].append(i)

--
@-salutations

Michel Claveau
Avatar
funtix
Chapeau pour ta réactivité et pour la solution qui tient en tres peu de
ligne.

Et dire que j'etais parti pour faire une usine a gaz.
Je pense qu'en reflechissant à l'algo a implementer j'aurais du
simplifier à l'extreme et prendre le probleme tel que je l'ai presenté
dans ce thread.
En tout cas c'est bien, je connaissais pas la fonction zip et setdefault.

Au fait pourquoi utiliser zip plus que pref.iteritems() ? preference
personnelle ou plus perf?

Merci beaucoup je vais de suite l'adapter a mon besoin.


Michel Claveau wrote:
Bonsoir !

Une façon de faire :

pref={}
pref['jean']=['jaune','vert','bleu']
pref['pierre']=['rouge','jaune','bleu']
pref['paul']=['rouge','bleu']
pref['jacques']=['jaune']

coul={}
for i,j in zip(pref,pref.values()):
for c in j:
coul.setdefault(c,[])
coul[c].append(i)

print '-'*55
print coul
print '-'*55
for i in coul:
print i,coul[i]
print '-'*55



Avatar
Méta-MCI
Bonsoir !


Au fait pourquoi utiliser zip plus que pref.iteritems() ? preference
personnelle ou plus perf?




Plutôt par paresse : c'est le premier truc qui m'est venu...
A noter : dans la deuxième version, je ne l'utilise plus.

Pour les perfs, je chercherais plutôt à tester du côté des listes en
intention ; ça va souvent assez vite.


Pour la réactivité, c'est dû au hasard : je passais par là. Tu aurais posté
un peu plus tard, j'aurais 2 jours à répondre, car je pars en déplacement
tantôt.



Bonne nuit.

MCI



Avatar
Bruno Desthuilliers
Michel Claveau wrote:
Un peu plus simple :

pref={}
pref['jean']=['jaune','vert','bleu']
pref['pierre']=['rouge','jaune','bleu']
pref['paul']=['rouge','bleu']
pref['jacques']=['jaune']

coul={}
for i in pref:
for c in pref[i]:
# coul.setdefault(c,[])

# coul[c].append(i)
coul.setdefault(c,[]).append(i)


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
funtix
je sais que les listes en intention sont plus rapides, mais j'ai un peu
de mal avec ca...



Méta-MCI wrote:
Bonsoir !



Au fait pourquoi utiliser zip plus que pref.iteritems() ? preference
personnelle ou plus perf?





Plutôt par paresse : c'est le premier truc qui m'est venu...
A noter : dans la deuxième version, je ne l'utilise plus.

Pour les perfs, je chercherais plutôt à tester du côté des listes en
intention ; ça va souvent assez vite.


Pour la réactivité, c'est dû au hasard : je passais par là. Tu aurais posté
un peu plus tard, j'aurais 2 jours à répondre, car je pars en déplacement
tantôt.



Bonne nuit.

MCI







Avatar
Boris Borcic
Michel Claveau wrote:
Un peu plus simple :

pref={}
pref['jean']=['jaune','vert','bleu']
pref['pierre']=['rouge','jaune','bleu']
pref['paul']=['rouge','bleu']
pref['jacques']=['jaune']



coul = lambda c : [p for p in pref if c in pref[p]]

faut-il vraiment un dictionnaire ? avec une fonction comme ça, il n'y a pas
besoin de propager les éventuelles mises-à-jour.

coul={}
for i in pref:
for c in pref[i]:
coul.setdefault(c,[])
coul[c].append(i)



Avatar
funtix
C'est vrai que c'est une possibilité. Mais c'est pas adapté dans mon cas
ou j'ai un dico avec pas loin de 100 clés et une 20aine de valeur
associée à chaque clé.

Coté liste en intention, vous avez des propositions?

Ca m'interesse meme si j'ai pu faire ce que je voulais avec la premiere
version d'algo de ce thread.


Boris Borcic wrote:
Michel Claveau wrote:

Un peu plus simple :

pref={}
pref['jean']=['jaune','vert','bleu']
pref['pierre']=['rouge','jaune','bleu']
pref['paul']=['rouge','bleu']
pref['jacques']=['jaune']



coul = lambda c : [p for p in pref if c in pref[p]]

faut-il vraiment un dictionnaire ? avec une fonction comme ça, il n'y a
pas besoin de propager les éventuelles mises-à-jour.

coul={}
for i in pref:
for c in pref[i]:
coul.setdefault(c,[])
coul[c].append(i)






Avatar
Michel Claveau
coul={}
[[coul.setdefault(det,[]).append(p) for det in pref[p]] for p in pref]

--
@-salutations

Michel Claveau
1 2