我试图在列表中找到具有最高出现次数的项目。
为此,我尝试将列表中的所有项目与列表中的所有其他项目进行比较,并在每次找到匹配项时将计数值增加1.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="field">
我的问题是&#34;如何将该项目与除自身以外的所有其他项目进行比较&#34;?
答案 0 :(得分:1)
虽然有很多更好的方法可以解决这个问题,例如@ zwer对你的问题的评论,这里有我如何解决你所问的问题:
# O(n ** 2)
def find_int(array):
n = len(array)
count = [1 for i in range(n)]
for i in range(n):
for j in range(n):
if i == j: continue
if array[i] == array[j]:
count[i] += 1
return max(count), count.index(max(count))
# Worse than O(n ** 2)
def find_int_using_slice(array):
n = len(array)
count = [1 for i in range(n)]
for i in range(n):
for a_j in array[0:i] + array[i+1:]:
if array[i] == a_j:
count[i] += 1
return max(count), count.index(max(count))
print(find_int_using_slice([1,2,3,1,2,3,2]))
我们在这里使用嵌套的for循环,并且当两个索引相同时使用continue
跳过迭代。
除非专门用于学习目的,否则请考虑将内置插件用于常见任务,因为它们已得到很好的实施,测试,优化等。
有许多潜在的解决方案,但根据您的应用程序的要求,我推荐这两个:1)从左到右依次排序和计数:O(n * log (n))并且丢失原始排序,或者2)使用字典来维持计数,从左到右只需要一次通过:O(n)但使用更多的内存。当然,更好的决定是使用高度优化的内置方法,但这是你的电话
答案 1 :(得分:1)
使用具有collections.Counter功能的most_common。
import collections
def findInt(array):
c = collections.Counter(array)
return c.most_common(1)
<强>样本强>
>>> import collections
>>> array=[1,2,3,1,2,3,2]
>>> c = collections.Counter(array)
>>> c.most_common(1)
[(2, 3)]
DOC
class collections.Counter([iterable-or-mapping])
Counter是用于计算可哈希对象的dict子类。它是一个无序集合,其中元素存储为字典键,其计数存储为字典值。计数允许为任何整数值,包括零或负计数。 Counter类与其他语言的包或多重集类似。<强> most_common([N])强>
返回n个最常见元素及其计数的列表,从最常见到最少。如果省略n或None,则most_common()返回计数器中的所有元素。具有相同计数的元素是任意排序的:
答案 2 :(得分:1)
更新了答案以反映OP不想使用<div class="triangle-base">
<div class="inner-triangle-left"></div>
<div class="inner-triangle-right"></div>
</div>
使用collections.Counter
在第一次出现时填充计数器,然后递增计数器。然后,您可以使用setdefault
和一个键来查找最常见的项目。
max
答案 3 :(得分:0)
def findInt(array):
count = []
for i in range(len(array)):
count.append(array.count(array[i]))
return max(count), count.index(max(count))
打印(findInt(数组= [1,2,3,1,2,3,2]))
答案 4 :(得分:0)
好吧,我会咬人 - 鉴于内存便宜,散列比循环更受欢迎。我认为使用临时注册表是最有效的方法之一:
def findInt(array):
occurrences = dict.fromkeys(array, 0)
for element in array:
occurrences[element] += 1
items = occurrences.values()
max_occurences = max(items)
return occurrences.keys()[items.index(max_occurences)], max_occurences
返回发生次数最多的元素的元组及其出现的次数。
实际上,让我们进一步优化它 - 这是一个纯粹的O(N)解决方案,没有额外的列表构建和搜索:
def findInt(array):
occurrences = dict.fromkeys(array, 0)
candidate = array[0]
occurs = 0
for element in array:
value = occurrences[element] + 1
occurrences[element] = value
if value > occurs:
candidate = element
occurs = value
return candidate, occurs
答案 5 :(得分:0)
Counter
非常适合计算可迭代项目的频率。或者,您可以使用defaultdict
循环一次。
import operator as op
import collections as ct
def findInt(array):
dd = ct.defaultdict(int)
for item in array:
dd[item] += 1
return dd
# Frequencies
array = [1, 2, 1, 1, 2, 1, 3, 3, 1]
freq = findInt(array)
freq
# Out: defaultdict(int, {1: 5, 2: 2, 3: 2})
# Maximum key-value pair (2 options)
{k:v for k,v in freq.items() if k == max(freq, key=lambda x: freq[x])}
# Out: {1: 5}
max({k:v for k,v in freq.items()}.items(), key=op.itemgetter(-1))
# Out: (1: 5)