检查数组中的连续值成员

时间:2019-07-11 21:17:56

标签: python arrays

围绕着几个类似的问题,建议对集合使用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化的方法是什么?

2 个答案:

答案 0 :(得分:1)

维护数组中元素到值的映射的最佳方法是哈希表。 因为@JacobIRR提到{[4,5,6]:6}无效,因为您不能将多个键关联到一个值。由于您没有提到函数的工作方式,因此我无法为您提供确切的解决方案。 如果您的算法依赖于列表作为键,则可以尝试{6:[4,5,6]}是有效的解决方案,因为HashMap不允许重复的键,但允许重复的值。

答案 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)])