2016-12-31 5 views
0

Поэтому у меня есть следующие категории чисел от 1-9:Сравнение 2D массива в Python с условием

кошка: целые числа от 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}) 

True и False представляют, если это даже. Этот Counter может использоваться как любой нормальный словарь:

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

Похоже, что вы ищете функции отображения: http://book.pythontips.com/en/latest/map_filter.html

Так что для 2D-массива, вы можете сделать что-то подобное, чтобы произвести ваш LISTB:

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

с «num_to_animal» функция, которая преобразует числа в животных в соответствии с вашими правилами.

+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