Python 查找一维数组在二维数组中重复次数最多的最佳方法
我有一个叫做Positions的2d数组,我想找出数组在Positions中重复的最高次数。位置中的数组元素都是整数 例如: 如果位置=[[1,1,1,1,1],[2,2,2,2],[3,3,3,3],[1,1,1,1]] 算法应该返回2,因为[1,1,1,1,1]在位置中出现两次Python 查找一维数组在二维数组中重复次数最多的最佳方法,python,algorithm,Python,Algorithm,我有一个叫做Positions的2d数组,我想找出数组在Positions中重复的最高次数。位置中的数组元素都是整数 例如: 如果位置=[[1,1,1,1,1],[2,2,2,2],[3,3,3,3],[1,1,1,1]] 算法应该返回2,因为[1,1,1,1,1]在位置中出现两次 对于我正在进行的项目,我将多次调用此函数,因此我想知道最快的方法。最简单的方法是使用max和count函数: >>> Positions = [[1,1,1,1,1], [2,2,2,2,2], [
对于我正在进行的项目,我将多次调用此函数,因此我想知道最快的方法。最简单的方法是使用
max
和count
函数:
>>> Positions = [[1,1,1,1,1], [2,2,2,2,2], [3,3,3,3,3], [1,1,1,1,1]]
>>> max(Positions.count(a) for a in Positions)
2
如果您在跟踪
位置的方式上有一定的灵活性(即,如果它们不需要是列表,而可以是不可变和/或散列的),您可以大大提高效率。如果位置
在您下方不断变化,则更难进行优化。最简单的方法是使用最大值
和计数
功能:
>>> Positions = [[1,1,1,1,1], [2,2,2,2,2], [3,3,3,3,3], [1,1,1,1,1]]
>>> max(Positions.count(a) for a in Positions)
2
如果您在跟踪位置的方式上有一定的灵活性(即,如果它们不需要是列表,而可以是不可变和/或散列的),您可以大大提高效率。如果位置
在你下方不断变化,则更难进行优化。要保持它O(n)
:
res={}
对于处于以下位置的el:
res[tuple(el)]=res.get(tuple(el),0)+1
打印(最大(分辨率值())
在您的情况下,它返回2
以保持O(n)
:
res={}
对于处于以下位置的el:
res[tuple(el)]=res.get(tuple(el),0)+1
打印(最大(分辨率值())
在您的情况下,当您想要计数时,通常会返回2
,然后最好查看集合。计数器
带到表中的内容。
计数器需要有可计数的类型,所以我将每个内部列表转换为一个元组进行计数,然后使用Counter.most_common()
In [93]: from collections import Counter
In [94]: Positions = [[1,1,1,1,1], [2,2,2,2,2], [3,3,3,3,3], [1,1,1,1,1]]
In [95]: item, count = Counter(tuple(x) for x in Positions).most_common(1)[0]
In [96]: list(item)
Out[96]: [1, 1, 1, 1, 1]
In [97]: count
Out[97]: 2
In [98]:
通常,当你想计数时,最好看看collections.Counter
给表中带来了什么。
计数器需要有可计数的类型,所以我将每个内部列表转换为一个元组进行计数,然后使用Counter.most_common()
In [93]: from collections import Counter
In [94]: Positions = [[1,1,1,1,1], [2,2,2,2,2], [3,3,3,3,3], [1,1,1,1,1]]
In [95]: item, count = Counter(tuple(x) for x in Positions).most_common(1)[0]
In [96]: list(item)
Out[96]: [1, 1, 1, 1, 1]
In [97]: count
Out[97]: 2
In [98]:
每个列表中的值范围有多大?能否将其转换/散列为一个更大的整数,并在位置列表更改时跟踪每个整数的当前计数?职位列表是如何变化的?多久?它能有多大?“最快的方法”通常应解释为“足够快的方法”,因为总是有一些方法可以做得更快。整数是否总是在1d数组中重复,或者它们是否可以不同,例如[[1,4,5,5,3],[2,1,7,6,3]…]
位置中的数组不会被更改,数组只会添加到位置或从位置中删除。我没有使用哈希算法的经验。每个列表包含64个值。此外,数字并不总是重复,您可以有[1,2,3,4,5]每个列表中的值范围有多大?能否将其转换/散列为一个更大的整数,并在位置列表更改时跟踪每个整数的当前计数?职位列表是如何变化的?多久?它能有多大?“最快的方法”通常应解释为“足够快的方法”,因为总是有一些方法可以做得更快。整数是否总是在1d数组中重复,或者它们是否可以不同,例如[[1,4,5,5,3],[2,1,7,6,3]…]
位置中的数组不会被更改,数组只会添加到位置或从位置中删除。我没有使用哈希算法的经验。每个列表包含64个值。而且数字并不总是重复,你可以有[1,2,3,4,5]