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

Python 循环遍历除自身之外的所有项,python,Python,我正在尝试在出现次数最多的列表中查找该项 为此,我尝试将列表中的每个项目与列表中的所有其他项目进行比较,并在每次找到匹配项时将count的值增加1 def findInt(array): count = [] count = [1 for i in range(0,len(array))] for i,item in enumerate(array): if (array[i] == array[i:]): #How can I comp

我正在尝试在出现次数最多的列表中查找该项

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

def findInt(array):
    count = []
    count = [1 for i in range(0,len(array))]        
    for i,item in enumerate(array):
        if (array[i] == array[i:]):  #How can I compare it with all items except itself?
            count[i]+=1

    return max(count), count.index(max(count))


findInt(array=[1,2,3])

我的问题是,如何将该项目与除自身之外的所有其他项目进行比较

虽然有很多更好的方法来解决这个问题,例如@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在一次从左到右的过程中进行排序和计数:打开*logn并丢失原始顺序;2使用字典来维护计数,只需要从左到右的一次过程:打开但使用更多内存。当然,更好的决定是使用经过高度优化的内置方法,但这是您的调用,它有一个函数

import collections
def findInt(array):
    c = collections.Counter(array)
    return c.most_common(1)
演示

医生

类集合.计数器[iterable或mapping] 计数器是用于计算可散列对象的dict子类。它是一个无序集合,其中元素存储为字典键,其计数存储为字典值。计数允许为任何整数值,包括零或负计数。计数器类类似于其他语言中的bags或Multiset

最普通的 返回n个最常见元素的列表及其从最常见到最少的计数。如果省略n或无,则most_common返回计数器中的所有元素。计数相等的元素可以任意排序:


printfindIntarray=[1,2,3,1,2,3,2]

更新了答案,以反映OP不想使用集合。计数器

使用setdefault为首次出现的计数器初始化,然后递增计数器。然后您可以使用max和一个键来查找最常见的项

def most_common(ar):
    y = {}

    for item in ar:
        y.setdefault(item, 0)
        y[item] += 1

    return max(y.items(), key=lambda x: x[1])

array = [1, 2, 1, 1, 2, 1, 3, 3, 1]
most_common(array)

(1, 5)  # (Most common item, occurrences of item)

好吧,我会咬一口——考虑到内存便宜,哈希比循环更受欢迎。我认为最有效的方法之一是使用临时注册表:

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
返回出现次数最多的元素的元组及其出现次数

实际上,让我们进一步优化它-这是一个纯ON解决方案,没有额外的列表构建和搜索:

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
计数器是一个理想的计数频率的项目在iterable。或者,可以使用defaultdict循环一次


您需要再次循环,使您的方法在*2上,因此不是很好。但我不明白你为什么要这样做;只需增加每个项目的计数[i],并完成它?if是多余的。这是一种非常复杂的计数事件的方法。使用collections.Counter来完成你的脏活。@zwer这是在考虑你是否不能使用像Counter这样的内置函数来完成这项工作。enumerate、range、len和max也是内置函数,与collections没有太大区别。Counter也不是一个函数,而是一个类型,但我们不必讨论语义实际上,我会的——而且因为我面试过不少候选人,我很乐意抛弃任何试图重新发明方向盘的人。当然,如果问题是“设计一个算法来查找列表中某个元素的最高匹配度”,我希望人们知道如何去做,但如果问题是以你的方式提出的,我希望候选人使用内置的。但我离题了,这里的评论不是用来聊天的……太棒了,但是我有没有办法用切片来达到这个目的呢?@ramailosathi-你为什么坚持用一种想象得到的最低效的方式来做这件事?!嗯。。。我将添加一个使用切片的示例,但我希望您能够思考一下,并认识到它的效率相当低的原因有很多潜在的解决方案,但根据应用程序的要求,我推荐以下两种解决方案:1从左到右单次排序和计数:on*logn和丢失原始顺序,或者2使用字典来维护计数,只需要从左向右传递一次:打开,但使用更多内存。当然,更好的决定是使用经过高度优化的内置方法,但这是你的要求。你应该在回答中加上:+1。编辑:集合。计数器对我不起作用,因为这是内置方法,无法首先解决问题。@ramailosathi抱歉,我没有理解你的意思。有什么理由不使用完美的内置方法吗?我的错,问题应该是设计一个算法来查找列表中元素的最高出现率老实说,这对您的项目有什么好处吗?我建议你花更多的时间做一些对你的职业生涯更重要的事情
大概吧。很抱歉没有恰当地表达这个问题,谢谢!这看起来像是开着的,是吗?谢谢你的解决方案。还有,为什么不退回y项呢?它将返回项目和出现次数。是的,我相信它是0n,因为您必须循环通过数组中的每n个项目。至于返回y.items,如果您想要所有项目,您可以这样做。我假设您只需要最常出现的单个项目。我的意思是返回maxy.items。为什么使用lambda表达式?啊,是的,因为y.items返回元组,所以我使用lambda确保从元组的发生计数位置1获得最大值。否则,max的输出将与键相关,在本例中,键是项,而不是项计数。
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
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
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)