循环遍历除自身之外的所有项目

时间:2017-05-20 01:06:47

标签: python

我试图在列表中找到具有最高出现次数的项目。

为此,我尝试将列表中的所有项目与列表中的所有其他项目进行比较,并在每次找到匹配项时将计数值增加1.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="field">

我的问题是&#34;如何将该项目与除自身以外的所有其他项目进行比较&#34;?

6 个答案:

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