2016-12-31 119 views
0

所以我有整數1-9以下幾類:比較2D陣列具有條件

貓:整數1〜3

狗:整數4-6

蛇:7〜9

整數我有一個看起來像這樣的列表:

listA =[[2, 4, 5, 7], 
     [5, 6, 7, 8], 
     [1, 2, 5, 8], ...] 

請注意,沒有一個數字可以連續出現兩次的情況。 例如,[1,1,4,5]不存在。

我設法創建另一個列表,從中可以看起來像:

listB = [[cat, dog, dog, snake], 
      [dog, dog, snake, snake], 
      [cat, cat, dog, snake], ...] 

我想知道每個類別中出現奇數和偶數的個數。例如,狗有34個甚至整數只有10個,貓有24個甚至35個,蛇有13個甚至3個。

有什麼想法?有什麼建議我應該做什麼?

+1

行索引是否重要? – lucianopaz

+0

@lucianopaz是的,但用於其他計算。在這種情況下,我在這裏,沒關係。 – utopia

回答

1

爲了讓您的整數列表,以動物名稱,你可以使用嵌套列表理解與字典查找:

num_to_animal = {1: 'cat', 2: 'cat', 3: 'cat', 
       4: 'dog', 5: 'dog', 6: 'dog', 
       7: 'snake', 8: 'snake', 9: 'snake'} 


listA =[[2, 4, 5, 7], 
     [5, 6, 7, 8], 
     [1, 2, 5, 8]] 

listB = [[num_to_animal[val] for val in row] for row in listA] 
listB 
# [['cat', 'dog', 'dog', 'snake'], 
# ['dog', 'dog', 'snake', 'snake'], 
# ['cat', 'cat', 'dog', 'snake']] 

但你並不需要一個計算數字每個類別的偶數/奇數值,你只需要檢查值屬於哪個動物,如果它是偶數或奇數。爲此,您可以使用collections.Counter

from collections import Counter 

def is_even(val): 
    return val % 2 == 0 

cnts = Counter((num_to_animal[val], is_even(val)) for row in listA for val in row) 
cnts 
# Counter({('cat', False): 1, 
#   ('cat', True): 2, 
#   ('dog', False): 3, 
#   ('dog', True): 2, 
#   ('snake', False): 2, 
#   ('snake', True): 2}) 

TrueFalse表示,如果是偶數。這Counter可以像任何正常的字典一樣使用:

cnts[('dog', True)] 
# 2 
1

這聽起來像你正在尋找一個地圖功能:http://book.pythontips.com/en/latest/map_filter.html

所以對於你的二維數組,你可能會做這樣的事情產生你的數組listB:以「num_to_animal」

listB = [] 
for row in listA: 
    listB.append(list(map(lambda x: num_to_animal_str(x), row)) 

函數根據您的規則將數字轉換爲動物。

+0

這是如何回答這個問題的?我沒有看到你如何從這裏得到每個類別的偶數/奇數的數量。據我瞭解,他已經得到了名單轉換爲「動物」。 – MSeifert

+1

@嗯嗯,我說我已經想通了如何做listB – utopia

+0

對不起,看起來我誤解了這個問題。 – Will

0

如果您使用的是NumPy,這些比較的表達方式都有表達方式。例如,

In [3]: arr = np.array(listA) 
In [4]: np.sum((arr>3) & (arr<7) & (arr % 2)) 
Out[4]: 3 # three dogs with odd integer identifiers