2017-08-23 4 views
0

J'ai une liste de tuples, où chaque tuple contient une représentation sous forme de chaîne de coordonnées xyz. Je dois comparer les première et seconde valeurs des tuples à un autre ensemble de valeurs dans un dictionnaire (pour déterminer si le premier élément du tuple est le point de départ ou point final)Comparaison efficace du tuple avec la liste

-à-dire

tuple_list = [('0.1, 0.5, 2.0', '3.0, 5.0, 6.0'), ('0.0, 0.6, 2.0', '4.0, 5.0, 6.0')] 

vertex_dict = {'0': '3.0, 5.0, 6.0', '1': '0.0, 0.6, 2.0'} 

Si le premier item du tuple correspond à la liste des vertex, je veux indiquer qu'il s'agit du point "start", tandis que le second élément du tuple est le point "end".

Actuellement, je suis en train d'accomplir cela avec le code suivant:

pt_line_dict = {} 
for key, value in vertex_dict: 
    for i, j in tuple_list: 
     if i == value: 
      pt_line_dict[key] = (i, j) 
     elif j == value: 
      pt_line_dict[key] = (j, i) 
     else: 
      pass 

Output: 
pt_line_dict = {'0': ('3.0, 5.0, 6.0', '0.1, 0.5, 2.0'), '1': ('0.0, 0.6, 2.0', '4.0, 5.0, 6.0')} 

Il n'y a aucune chance d'avoir des doublons entre tuples, et le dictionnaire de sommet est également unique (pas de répétitions de valeurs clés).

Y a-t-il une manière plus efficace de faire ceci qui évite de boucler toutes les valeurs dans la liste de tuple? Je pense qu'un générateur pourrait être une façon de le faire ...

+0

quelle serait la sortie désirée pour l'exemple que vous avez posté? –

+0

Je ne peux pas comprendre ce que vous voulez faire. – stamaimer

+1

votre approche initiale n'est pas si mauvaise – RomanPerekhrest

Répondre

0

Selon « Il n'y a aucune chance d'avoir des doublons entre tuples, et le dictionnaire de sommet est également unique » et vous avez besoin d'une manière plus efficace de faire ce qui évite une boucle sur toutes les valeurs dans la liste des tuple - Je ne peux que suggérer la solution qui évite les itérations de boucle interne redondantes:

pt_line_dict = {} 

for k,v in vertex_dict.items(): 
    for t in tuple_list: 
     if v in t: 
      idx = t.index(v) 
      pt_line_dict[k] = (t[idx], t[int(not idx)]) 
      break 

print(pt_line_dict) 

la sortie:

{'0': ('3.0, 5.0, 6.0', '0.1, 0.5, 2.0'), '1': ('0.0, 0.6, 2.0', '4.0, 5.0, 6.0')}