Przepisanie słownika do tablicy - problemy

2012-04-15 13:32
maciej-python
0

Hej,

mam słownik w takiej postaci:

slownik = {1: {2:3, 3:4, 5:6}, 2: {1:3, 3:4, 5:6}, 3: {1:4, 2:4, 5:6}, ...}

itd ... czyli tak jakby:

przejście   koszt

1 -> 2    =     3
1 -> 3    =     4
1 -> 5    =     6

i mam ten słownik wpisać do tablicy, w taki sposób:

tablica[1][2] = 3
tablica[1][3] = 4
tablica[1][5] = 6

ale jeśli wpisałem wartość do tablica[1][2], to nie wpisuję już jej
w tablica [2][1], tylko zostawiam pustę (domyślnie wypełniłbym tablicę sys.maxsize)

Jak to zrobić?

Slownik i podsłowniki mam w pliku:

5 - ile elem w podstawowym słowniku
1 - który element (klucz) słownika
3 - ile kluczy ma podsłownik
3 1 - pary (klucz, wartość)
4 1
5 1
...

Mój plik cały:

5
1
3
3 1
4 1
5 1
2
2
4 1
5 1
3
3
1 1
4 1
5 1
4
4
1 1
2 1
3 1
5 1
5
4
1 1
2 1
3 1
4 1

Mój kod (czyta ze słownika i wpisuje odpowiednio, ale nie wiem, jak wpisać to do tablicy, w sposób, który opisałem:)

# -*- coding: utf-8 -*-
#!/usr/bin/env python
from numpy import zeros
import sys

"""
Reprezentacja slownika:
slownik = {1: {2:4, 3:5}, 2: {3:4}, 3: {1:5, 2:4}}
"""

slownik = {}
filename = input("Plik z danymi (nazwa): ")
try :
    with open(filename, 'r') as file :
        N = int(file.readline().rstrip("\n"))
        for i in range(0, N) :
            num = int(file.readline().rstrip("\n"))
            M = int(file.readline().rstrip("\n"))
            podslownik = {}
            for j in range(0, M) :
                sasiad, koszt = file.readline().rstrip("\n").split()
                podslownik[int(sasiad)] = int(koszt)
            slownik[int(num)] = podslownik
except IOError :
    print("Błąd we/wy. (Brak pliku)")

if len(slownik) != 0 :

    tablica = zeros((N,N), float)
    tablica.fill(sys.maxsize)
    for i in range (0, N) :
        tablica[i][i] = 0

    #przepisanie slownika do tablicy ...

Pozostało 580 znaków

2012-04-15 13:46
0

Wpisuj element do tablicy tylko gdy numer pierwszego wierzchołka jest mniejszy niż numer drugiego, wtedy każda krawędź będzie w tej macierzy tylko jeden raz.

Pozostało 580 znaków

2012-04-15 13:53
maciej-python
0

Hmm, mam problem z "dobraniem się" do elementów słownika:

#przepisanie slownika do tablicy ...
    for i in range (0, N) :
        for j in range (0, N) :
            if i < j :
                tablica[i][j] = slownik[i+1][j+1]

to nie działa, pokazuje błąd:

Traceback (most recent call last):
File "E:/slownik.py", line 38, in <module>
tablica[i][j] = slownik[i+1][j+1]
KeyError: 3

Pozostało 580 znaków

2012-04-15 13:58
0

Możesz albo sprawdzać, czy element jest w słowniku, albo nie iść po tablicy, tylko po słowniku.

Pozostało 580 znaków

2012-04-15 14:00
maciej-python
0

Nie bardzo rozumiem ?

Pozostało 580 znaków

2012-04-15 14:09
0
 for n1,d in slownik.iteritems():
    for n2,cost in d.iteritems():
        if n1<n2:
            tablica[n1][n2]=cost

Oczywiście dopasuj numerowanie do swojego przypadku. Operator sprawdzenia, czy element jest w kolekcji to "in".

edytowany 1x, ostatnio: Zjarek, 2012-04-15 14:13

Pozostało 580 znaków

2012-04-15 14:21
maciej-python
0

Dziękuję, wygląda na to, że jest ok:)

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0