0

I am trying to create an adjacency list dictionary in python by reading a .txt file with this format:

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

I want the resulting dictionary to be of this format :

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

NOTICE that despite looking like a directed graph, it actually is undirected and the list-value of each key in the dictionary must contain all the adjacent nodes, for example [10]: [1,4,7] despite 10 not being in the first column in any of the txt file lines.

Right now i am stuck with this code block:

# 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

Please ignore all other variables, the dictionary adjacency_graph is what i am concerned about. :)

How should i proceed?

4
  • Would you have some code to show?? Commented Apr 18, 2017 at 13:43
  • Break this down into smaller parts. First open the file and just print each line. Then go from there. Commented Apr 18, 2017 at 13:49
  • @Astrom heloo, please take a look again, i edited the post, i hope it helps :) Commented Apr 18, 2017 at 13:54
  • thanks! you have nice solutions below, pick one :) Commented Apr 18, 2017 at 14:02

2 Answers 2

3

You can do this by using .setdefault and split. Basically, the code will create a new list at key parts[0], if it's not defined. After that, we append to the list.

di = {}

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

print(di)

And the easiest way to make it bidirectional is to append the dictionary both ways:

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)
Sign up to request clarification or add additional context in comments.

2 Comments

like that one!!
@Jammeth_Q Thanks for the input, I updated the answer.
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

output: {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]}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.