所以我有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个奇数。
有什么想法吗?有什么建议我应该做什么?
答案 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})
True
和False
代表它是否均匀。这个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