[Python 2.7] dictionnaire et liste de listes
Bonjour,
Je me permets de solliciter votre aide pour ameliorer/corriger un script...
A partir d'un dictionnaire le but est de créer des relations entre individus quand ils partagent les mêmes éléments.
Je génère un output pour visualiser les liens (network).
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| populations3={'ind1':['H','R1b'],'ind2':['H','R1b'],'ind3':['K1a','R1b'],'ind4':['K1a','J2a'], 'ind5':['H','R1b']}
list_ind = list(populations3.keys())
n=len(list_ind)
net=[]
net2=[]
for i in range(n) :
for j in range(n) :
list1 = populations3[list_ind[i]]
list2 = populations3[list_ind[j]]
#a = common_elements(list1_ind,list2_ind)
en_commun=[elt for elt in list1 if elt in list2]
en_commun2='_'.join(en_commun)
net=list_ind[i],list_ind[j],en_commun2
net2.append(net)
net3=[]
for i in net2:
if i[2] != '':
net3.append(i)#exclut les echantillons qui n ont pas de relations
for i in net3:
print i |
Le résultat est correct, il affiche les ID des individus qui partagent les même éléments. Néanmoins, si on se focalise sur les individus qui partagent H_R1b voilà le resultat:
Code:
1 2 3 4 5 6 7 8 9
| ('ind5', 'ind5', 'H_R1b')
('ind5', 'ind1', 'H_R1b')
('ind5', 'ind2', 'H_R1b')
('ind1', 'ind5', 'H_R1b')
('ind1', 'ind1', 'H_R1b')
('ind1', 'ind2', 'H_R1b')
('ind2', 'ind5', 'H_R1b')
('ind2', 'ind1', 'H_R1b')
('ind2', 'ind2', 'H_R1b') |
Il y a des redondances que je n arrive pas à supprimer:
par exemple :
Code:
1 2 3
| ('ind1', 'ind1', 'H_R1b')
('ind2', 'ind2', 'H_R1b')
('ind5', 'ind5', 'H_R1b') |
De plus je cherche a réduire le nombre de liens dont certains sont inutiles dans mon cas par exemple entre ind1 et ind 2 le code affiche: ('ind2', 'ind1', 'H_R1b'), ('ind1', 'ind2', 'H_R1b'), une seule de ces relations suffirait.
En gros si on se focalise seulement sur les Individus qui partagent H1,R1b je cherche à avoir comme résultat
Code:
1 2 3 4
| populations3={'ind1':['H','R1b'],'ind2':['H','R1b'], 'ind5':['H','R1b']}
('ind1', 'ind2', 'H_R1b')
('ind1', 'ind5', 'H_R1b')
('ind2', 'ind5', 'H_R1b') |
Ce qui dans l'idée revient au résultat affiche plus haut mais avec une réduction du nombre de liens (redondance)
J'espère ne pas être trop confus.
Merci pour votre aide