围绕着几个类似的问题,建议对集合使用any()
,但是我的方式有点不同,我想以最有效和Pythonic的方式从现有的数组中形成新数组关于会员资格。
我有以下数组[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6], [2, 4, 5, 6, 9, 1, 4, 5, 6, 4, 5, 6], [1, 2, 9, 4, 5, 6, 7, 7, 8, 5]]
我需要的是一种形成新对象{[4, 5, 6] : 6}
的方法,其中[4, 5, 6]
是键,而6
是键序列出现在上面的数组中的次数。 / p>
我通过使用简单的for循环创建函数来实现了结果,但是我认为这不是实现它的最Python高效的方式。我当时也在考虑同时使用map()
和filter()
。
实现结果的最有效,最Python化的方法是什么?
答案 0 :(得分:1)
答案 1 :(得分:1)
您可以使用collection中的Counter并使用各个列表中的所有3个数字元组初始化一个Counter对象。然后,您将可以立即获取任何3个数字序列的计数:
lists = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6], [2, 4, 5, 6, 9, 1, 4, 5, 6, 4, 5, 6], [1, 2, 9, 4, 5, 6, 7, 7, 8, 5]]
from collections import Counter
counts = Counter( (a,b,c) for lst in lists for a,b,c in zip(lst,lst[1:],lst[2:]) )
print(counts[(4,5,6)]) # 6
counts
是一本Counter字典,其中将包含:
{ (4, 5, 6): 6, (5, 6, 7): 2, (1, 2, 3): 1,
(2, 3, 4): 1, (3, 4, 5): 1, (6, 7, 8): 1,
(7, 8, 9): 1, (8, 9, 10): 1, (9, 10, 4): 1,
(10, 4, 5): 1, (2, 4, 5): 1, (5, 6, 9): 1,
(6, 9, 1): 1, (9, 1, 4): 1, (1, 4, 5): 1,
(5, 6, 4): 1, (6, 4, 5): 1, (1, 2, 9): 1,
(2, 9, 4): 1, (9, 4, 5): 1, (6, 7, 7): 1,
(7, 7, 8): 1, (7, 8, 5): 1 }
如果您只需要单个系列的计数,则可以直接使用列表推导:
len([s for lst in lists for s in zip(lst,lst[1:],lst[2:]) if s==(4,5,6)])