2017-04-18 4 views
0

Je suis en train de créer un dictionnaire de liste de contiguïté en python en lisant un fichier .txt avec ce format:Comment lire le fichier txt et créer le dictionnaire avec la liste de contiguïté python

1 2 
1 3 
1 10 
2 3 
4 5 
4 6 
4 10 
5 6 
7 8 
7 9 
7 10 
8 9 

Je veux le dictionnaire résultant être de ce format:

adjacency_list_dict = {[1]: {[2,3,10], [2]: [1,3] ....} etc

AVIS que, malgré l'air d'un dirigé graphique, il n'est pas dirigé et la valeur de liste de chaque clé du dictionnaire doit contenir tous les nœuds adjacents, par exemple exemple [10]: [1,4,7] malgré 10 ne pas être dans la première colonne dans l'une des lignes de fichier txt.

En ce moment je suis coincé avec ce bloc de code:

# Main file for assignment 2 
input_filename = "example_graph_1.txt" 
def create_teams(): 
    return [] 
def create_lex(): 
    return {} 
def make_to_list(node): 
    return [node] 

teams = create_teams() 
adjacency_graph = create_lex() 

with open(input_filename) as graph_input: 
    for line in graph_input: 
     nodes = [int(x) for x in line.split()] 
     for i in nodes: 
      if make_to_list(i) not in teams: 
       teams.append(make_to_list(i)) 
      if i not in adjacency_graph: 
       adjacency_graph[i] = create_teams() 
    print adjacency_graph 
    print teams 

S'il vous plaît ignorer toutes les autres variables, le dictionnaire est adjacency_graph ce que je suis préoccupé par. :)

Comment dois-je procéder?

+0

Auriez-vous du code à afficher? – Astrom

+0

Décomposer en plus petites parties. Commencez par ouvrir le fichier et imprimez chaque ligne. Ensuite, allez à partir de là. –

+0

@Astrom heloo, s'il vous plaît jeter un oeil à nouveau, j'ai édité le poste, j'espère que cela aide :) – Marios

Répondre

3

Vous pouvez le faire en utilisant .setdefault et diviser. Fondamentalement, le code créera une nouvelle liste à la clé parts[0], si elle n'est pas définie. Après cela, nous ajoutons à la liste.

di = {} 

with open("file.txt", "r") as fi: 
    for line in fi: 
     parts = line.split() 
     di.setdefault(parts[0],[]).append(parts[1]) 

print(di) 

Et la meilleure façon de le rendre bidirectionnel est d'ajouter le dictionnaire dans les deux sens:

di = {} 

with open("file.txt", "r") as fi: 
    for line in fi: 
     parts = line.split() 
     di.setdefault(parts[0],[]).append(parts[1]) 
     di.setdefault(parts[1],[]).append(parts[0]) 

print(di) 
+0

comme celui-là !! – Astrom

+0

@Jammeth_Q Merci pour la contribution, j'ai mis à jour la réponse. – Neil

1
import numpy 

l1, l2 = numpy.genfromtxt('t.txt', dtype='float').T 
uniques = list(numpy.unique(l1))+list(numpy.unique(l2))  
dic = {} 

for i in numpy.unique(uniques): 
    a =list(l2[numpy.where(l1 == i)[0]]) 
    b =list(l1[numpy.where(l2 == i)[0]]) 

    c = list(numpy.unique(a+b)) 
    dic[i] = c 

sortie: {1.0: [2.0, 3.0, 10.0], 2.0: [ 1.0, 3.0], 3.0: [1.0, 2.0], 4.0: [5.0, 6.0, 10.0], 5.0: [4.0, 6.0], 6.0: [4.0, 5.0], 7.0: [8.0, 9.0, 10.0], 8.0 : [7.0, 9.0], 9.0: [7.0, 8.0], 10.0: [1.0, 4.0, 7.0]}