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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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