2013-04-09 2 views
2

목록 목록에서 주어진 노드의 모든 이웃을 찾는 방법을 찾으려고합니다. 배열은 다음과 같습니다python 목록 목록에서 주어진 노드의 모든 이웃 찾기

0,2,4,1,6,0,0 
2,0,0,0,5,0,0 
4,0,0,0,5,5,0 
1,0,0,0,1,1,0 
6,5,0,1,0,5,5 
0,0,5,1,5,0,0 
0,0,0,0,5,0,0 

지금까지 내 코드는 다음과 같습니다

#!/usr/bin/python 

#holds all source nodes 
source = [] 

#read in and store the matrix 
def create_matrix(file): 
    with open('network.txt') as f: 
     Alist = [] 
     for line in f: 
      part = [] 
      for x in line.split(','): 
       part.append(int(x)) 
      Alist.append(part) 
    return Alist 

def check_neighbours(Alist): 
    i = iter(Alist) 
    item = i.next() 
    source.append(item) 
    print source 

file = ("F:/media/KINGSTON/Networking/network.txt") 
Alist = create_matrix(file) 
check_neighbours(Alist) 

는 분명히 이것은 단지 행렬의 첫 번째 행을 출력하지만 난 조금 다른 뭔가를 원하고있다. 예를 들어, 0부터 시작하여 [0,1] 노드와 [1,0] 노드를 모두 찾습니다. 그러나 행렬의 가장자리에 있지 않으면 3x3 반경을 조사해야합니다. 나는 현재 노드의 오른쪽에 다음 이웃을 찾는 방법을 안다.하지만 대각선 노드를 포함하는 노드 옆에있는 것을 찾는 법을 정말로 모르겠다.

+0

당신은 3의 직경을 의미하지 당신은? 노드에서 (가장자리에 없다고 가정하면) 왼쪽, 오른쪽, 위, 아래, 4 개의 대각선 값이 필요합니까? 아니면 왼쪽에 2, 오른쪽에 2 등을 원하십니까? – DaveTheScientist

+0

예 직경 3입니다. 나는 이전의 것을 기쁘게하겠습니다. – user2263800

답변

4

당신은 실제로리스트리스트에서 단지 인덱스의 선택 인 8- 이웃 알고리즘을 원합니다. 목록 압축하지 않고

m = create_matrix(file) 
i = some_y_location 
j = some_x_location 
neighbors = find_neighbors(m, i, j) 

구현 : 다음 호출 할 수 있습니다

# i and j are the indices for the node whose neighbors you want to find 
def find_neighbors(m, i, j, dist=1): 
    return [row[max(0, j-dist):j+dist+1] for row in m[max(0, i-1):i+dist+1]] 

def find_neighbors(m, i, j, dist=1): 
    neighbors = [] 
    i_min = max(0, i-dist) 
    i_max = i+dist+1 
    j_low = max(0, j-dist) 
    j_max = j+dist+1 
    for row in m[i_min:i_max]: 
     neighbors.append(row[j_min:j_max]) 
    return neighbors 

당신은 부정적인 지표를 방지하기 위해 I/j_min에 대한 최대 호출이 필요하지만, 상위 값이 너무 크면 목록 조각에 의해 자동으로 처리됩니다.

neighbors = [elem for nlist in neighbors for elem in nlist] 

이이 목록의 목록을 평평 : 단일 요소 목록으로 그 행 목록을 원하는 경우

당신은 추가해야합니다. 대신 이웃의 모든 인덱스를 원하는 경우

는 (아마 청소기 솔루션이 있습니다) :

def find_neighbor_indices(m, i, j, dist=1): 
    irange = range(max(0, i-dist), min(len(m), i+dist+1)) 
    if len(m) > 0: 
     jrange = range(max(0, j-dist), min(len(m[0]), j+dist+1)) 
    else: 
     jrange = [] 
    for icheck in irange: 
     for jcheck in jrange: 
      # Skip when i==icheck and j==jcheck 
      if icheck != i or jcheck != j: 
       neighbors.append((icheck, jcheck)) 
    return neighbors 
+0

이것은 아마도 매우 기본적인 것이고 이것을 묻는 것이 당황 스럽습니다. 내 코드는 이제 다음과 같이 보입니다 : Alist [max (0, i-1) : i]의 행에 대해 이웃 = [행 (max, 0-j-dist) : j + dist +1] Alist = create_matrix (파일) + dist +1]] 나는 i, j, dist 등등이 정의되지 않았다고 말하는 오류가 계속 발생합니까? – user2263800

+1

걱정할 필요가 없습니다. i와 j는 이웃을 알고 자하는 노드의 좌표입니다. 좌상 구석의 이웃들을 알고 싶습니다. 그런 다음 이웃을 만들기 전에'i = 0'과'j = 0'을 설정합니다. 이 점을 반영하여 답변을 업데이트하겠습니다. – Pyrce

+0

각 숫자의 좌표를 반환 할 수있는 방법이 있습니까? – user2263800

관련 문제