2011-12-01 5 views
3

저는 파이썬을 배우고 있습니다. 연습을 위해 파일 (그래프가 포함 된 Trivial Graph Format)을 읽고 그래프에 몇 가지 그래프 알고리즘을 실행하는 스크립트를 작성했습니다.n 사전 목록을 만드는 방법

그래프를 n 사전 목록에 저장하는 것에 대해 생각했습니다. 여기서 n은 정점의 수이고 정점의 모든 가장자리는 사전에 저장됩니다.

나는이

edges = [{} for i in xrange(num_vertexes)] 
for line in file: 
    args = line.split(' ') 
    vertex1 = int(args[0]) 
    vertex2 = int(args[1]) 
    label = int(args[2]) 
    edges[vertex1][vertex2] = label 

을 시도하지만 난 마지막 줄이 오류를 받고 있어요 : 그것은 vertex1처럼 보이는

IndexError: list index out of range

+0

생성하려는 데이터 형식의 예와이 데이터 형식을 생성하는 파일의 줄을 제공 할 수 있습니까? – sberry

+4

@DavidAlber 내부 사전이 참조로 복사되므로 잘 작동하지 않습니다. 'tst = [{}] * 5; tst [0] [1] = 1; tst'는'{{1 : 1}, {1 : 1}, {1 : 1}, {1 : 1}, {1 : 1} 대신에 xrange x (num_vertexs)의'{{} '를 사용할 수 있습니다. –

+3

당신은에 관심이있을 수 있습니다 [구현 그래프]에 대한 귀도의 에세이 (http://www.python.org/doc/essays/graphs.html) –

답변

4

아마 num_vertexes보다 더 크다. 파이썬 인덱스가 0이고 포맷의 위키에있는 예제가 1에서 나온다면, 마지막 라인의 꼭지점 수는 아마 인덱스 길이보다 1 일 것입니다 (필자는 파일을 확실히 알아야합니다.)). 따라서 파이썬의 경우 lst[0]이 첫 번째 요소이고 lst[n-1]이 정점의 경우 첫 번째 요소 인 1이 마지막 요소이고 마지막 요소가 n 인 마지막 요소입니다.

그래서 여기에 수정, 문제는 데이터와 함께 어딘가에 vertex1 = int(args[0])-1

+0

어리석은 나를! 어떻게 이것을 간과 할 수 있었습니까? vertex1 = int (args [0]) -1을 사용하여 해결했습니다. 정말 고맙습니다 :) – kai

2

를 사용하는 코드가 잘못된 데이터에 질식하지 않도록 몇 가지 유효성 검사를 추가하는 것입니다. 현재 행에 숫자가 아닌 숫자가 있거나 숫자가 3 개 미만이거나 vertex1 >= len(edges) 인 경우 코드가 실패합니다. 필요한 경우

edges = [{} for i in xrange(num_vertexs)] 
for line in file: 
    args = line.split(' ') 
    if len(args) >= 3: 
     try: 
      vertex1 = int(args[0]) 
      vertex2 = int(args[1]) 
      label = int(args[2]) 
      if vertex1 < len(edges): 
       edges[vertex1][vertex2] = label 
      else: 
       # value for vertex1 is too large 
       pass 
     except ValueError: 
      # you got some non-number data 
      pass 
    else: 
     # you got a line with not enough data 
     pass 

은 (당신이 그들을 사용하지 않는 경우도 두 else 블록을 제거 할 수 있습니다) 기록과 그 pass 문 중 하나를 교체합니다.

관련 문제