比较python中的2D数组和条件

时间:2016-12-31 20:03:13

标签: python arrays list

所以我有1-9的以下整数类别:

cat:从1到3的整数

dog: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个奇数。

有什么想法吗?有什么建议我应该做什么?

3 个答案:

答案 0 :(得分: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'功能,可根据您的规则将数字转换为动物。

答案 1 :(得分: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

答案 2 :(得分: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