2013-11-01 3 views
1

:파이썬과 내가 매트릭스 다음 한 매트릭스

W = [['a', 'b', 'b', 'b', 'a'], 
    ['a', 'a', 'a', 'a', 'b'], 
    ['a', 'b', 'a', 'b', 'b'], 
    ['a', 'a', 'a', 'b', 'b'], 
    ['b', 'b', 'b', 'b', 'b'], 
    ['b', 'b', 'b', 'b', 'b']] 

[X] [Y] 매트릭스에서, 어떻게 그 spesific 포인트 주위에-문자를 셀 수 W 내가 선택하는 경우? 예를 들어 내가 W [4] [1]을 선택한다고 가정 해 봅시다. 그 지점 주변에는 3 개의 a가 있음을 알 수 있습니다. 그러나 코딩으로 어떻게 결정할 수 있습니까? 코드가 정말 지저분 해졌고 행렬의 차원을 변경하면 작동하지 않을 것이라는 것을 깨달았습니다. 문제는 또한 내가 가까운 라운드 지점을 선택하면 W[y-1][(x):(x+1)].count("a") - 생각의 종류가 작동하지 않는다는 것입니다.

다시 도움을 받으실 수 있습니다! 감사!

UPDATE :

W  = [['K', ' ', ' ', ' ', ' '], 
     ['K', 'K', 'K', 'K', ' '], 
     ['K', ' ', 'K', ' ', ' '], 
     ['K', 'K', 'K', ' ', ' '], 
     [' ', ' ', ' ', ' ', ' '], 
     [' ', ' ', ' ', ' ', ' ']] 

def count_matrix(W, y, x, ch="K"): 
    ref = (-1, 0, 1) 
    occ = [] 
    a = "K" 
    b = " " 
    for dy, dx in [(a, b) for a in ref for b in ref if (a,b)!=(0, 0)]: 
     if (x+dx) >= 0 and (y+dy) >= 0: 
      try: 
       occ.append(W[x+dx][y+dy]) 
      except IndexError: 
       pass 
    return occ.count(ch) 
print count_matrix(W,0,0) 

0를 반환합니다. 설명은

+1

오타 :'ref = (-1, 0, -1)' – alko

+0

이제 매력처럼 작동합니다! @alko와 @ drewk에게 감사합니다! – Waldema

+0

'a = 'K''와'b = ""'는 당신이 생각하는 것을하지 않습니다. 목록 이해력 내의'a'와'b'는 단지 네임 스페이스 범위가 이해에 한정된 임시 변수입니다. a와 b를 이해력 밖의 다른 값으로 설정해도 아무런 변화가 없습니다. – dawg

답변

2

이 작동 : 당신이 광장 자체의 문자를 계산하려면

W = [['a', 'b', 'b', 'b', 'a'], 
    ['a', 'a', 'a', 'a', 'b'], 
    ['a', 'b', 'a', 'b', 'b'], 
    ['a', 'a', 'a', 'b', 'b'], 
    ['b', 'b', 'b', 'b', 'b'], 
    ['b', 'b', 'b', 'b', 'b']] 

def count_matrix(W, r,c, ch): 
    ref=(-1,0,1) 
    matches=[] 
    for dr, dc in [(a, b) for a in ref for b in ref if (a,b)!=(0,0)]: 
     if r+dr>=0 and c+dc>=0: 
      try: 
       matches.append(W[r+dr][c+dc]) 
      except IndexError: 
       pass 
    return matches.count(ch) 

print count_matrix(W,0,0,'a') # correctly handles upper LH 
# 2 
print count_matrix(W,4,1,'a') 
# 3 

if (a,b)!=(0,0)를 제거합니다. 즉, 사각형 0,0으로 'a'를 계산합니까?

+0

아니요 계산하지 않습니다. 그러나 나는 사용자가 a와 b를 스스로 결정할 수있게하면 문제가 다시 발생했다. 사용자가 = "K"및 b = ""를 선택했다고합시다. 여전히 나는 "K"를 카운트 할 수 있기를 원합니다 : 매트릭스없이 에러없이. 어떤 제안? – Waldema

+0

원본 게시물의 업데이트를 확인하십시오! – Waldema

1

참조 코드 주석 :

from itertools import product 

W = [['a', 'b', 'b', 'b', 'a'], 
    ['a', 'a', 'a', 'a', 'b'], 
    ['a', 'b', 'a', 'b', 'b'], 
    ['a', 'a', 'a', 'b', 'b'], 
    ['b', 'b', 'b', 'b', 'b'], 
    ['b', 'b', 'b', 'b', 'b']] 

def count_chars(W, x, y, ch): 
    return sum(W[x+dx][y+dy] == ch 
        for dx, dy in product([-1,0,1], [-1,0,1]) 
         if 0 <= x+dx < len(W) and 0 <= y+dy < len(W[0])) 
+0

그래, IndexError를 무시하는 것뿐입니다. 재미 있습니다. 더 쉽게 할 수 있다고 생각했습니다. 하지만 고마워! – Waldema

+0

덜 읽기 쉬운 솔루션을 추가했습니다. – alko

+1

이것은 여러 가지면에서 올바르지 않습니다 : 1)'W [0-1]'또는'W [] [0-1]'이 이제 그리스트의 끝을 제공 할 것이기 때문에 어떤 맨 윗줄이나 왼쪽 컬럼이 상대 인덱스로 바뀔 것입니다.) '1'때문에 try가 트리거되지 않습니다. 3) 'product [- 1,0,1], [-1,0,1]'이 튜플을 생성 할 것이기 때문에 오프셋 오류가없는 사각형을 카운트한다. 3) 오프셋 [W [x] [y] '(0,0)'을 결과 중 하나로 사용하십시오 – dawg

0

원래의 행렬 문제에 관해서는 :이 방법에 대해

W = [['a', 'b', 'b', 'b', 'a'], 
    ['a', 'a', 'a', 'a', 'b'], 
    ['a', 'b', 'a', 'b', 'b'], 
    ['a', 'a', 'a', 'b', 'b'], 
    ['b', 'b', 'b', 'b', 'b'], 
    ['b', 'b', 'b', 'b', 'b']] 

를?

def count_matrix(W, x, y): 
    occ = 0 
    for n in range(max(0, y - 1), min(len(W), y + 2)): 
     for m in range(max(0, x - 1), min(len(W[0]), x + 2)): 
      if W[n][m] == "a": 
       occ += 1 
    return occ 

print count_matrix(W, 0, 0) 

retunrs 3. 남은 문제는 사각형 자체의 가치를 어떻게 배제하는 것입니까?

편집 :

def count_matrix(W, x, y): 
occ = 0 
for n in range(max(0, y - 1), min(len(W), y + 2)): 
    for m in range(max(0, x - 1), min(len(W[0]), x + 2)): 
     if n == y and m == x: 
      pass 
     else: 
      if W[n][m] == "a": 
       occ += 1 
return occ 

W = [['a', 'b', 'b', 'b', 'a'], 
    ['a', 'a', 'a', 'a', 'b'], 
    ['a', 'b', 'a', 'b', 'b'], 
    ['a', 'a', 'a', 'b', 'b'], 
    ['b', 'b', 'b', 'b', 'b'], 
    ['b', 'b', 'b', 'b', 'b']] 

print count_matrix(W, 1, 4) 

반환 예상대로 3.

print count_matrix(W, 0, 0) 

예상대로 2을 반환합니다. 이 좋은 습관인가?

+0

행렬이 1x1 행렬 인 경우에도 오류가 발생하지 않습니다. 그래서 이것은 내가 찾고있는 코드 일뿐입니다! – Waldema