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']]

行列から W[x][y] を選択した場合、その特定の点の周りの文字をどのように数えることができますか? たとえば、b である W[4][1] を選択するとします。その点の周りに 3 つの a があることがわかります。しかし、コーディングによってどのように判断できますか? 私は非常に厄介なコードのピースになってしまい、行列の次元を変更すると機能しないことに気付きました。問題は、ラウンドに近いポイントを選択すると、W[y-1][(x):(x+1)].count("a")ある種の思考が機能しないことでもありました。

繰り返しますが、助けていただければ幸いです。ありがとう!

アップデート:

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

4

3 に答える 3

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」を数えますか?

于 2013-11-02T00:54:41.273 に答える
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]))
于 2013-11-01T22:58:43.887 に答える
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)

リターン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。これは良い習慣ですか?

于 2013-11-02T08:34:06.420 に答える