Python 查找一维数组在二维数组中重复次数最多的最佳方法

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], [

我有一个叫做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], [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]