2013-11-01 145 views
1

我有以下矩陣:Python和矩陣

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]從矩陣,我怎麼能指望周圍的spesific點字符?例如,假設我選擇W [4] [1],即b。我可以看到那邊有三個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,我就會再次陷入困境。假設用戶選擇a =「K」和b =「」。不過,我希望能夠在矩陣中計數「K」:s而沒有錯誤。有什麼建議麼? – 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]現在會給出列表2的結尾,因此任何頂行或左列都會切換到相對索引)由於'1',嘗試永遠不會被觸發;因爲'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