Python 在列表中查找max元素

Python 在列表中查找max元素,python,list,variable-assignment,Python,List,Variable Assignment,这是我在作业中遇到的一个问题: 编写一个函数majority(a),返回a中至少出现len(a)//2+1次的值。如果在中不存在这样的元素,则此函数返回None 作业中的想法是想出尽可能快的方法 我的想法是保留一个包含每个元素计数的字典,然后在字典中循环查看是否有任何元素的计数为len(a)//2+1 但这似乎并不奏效。有人能给我一个更好的解决方案并解释给我听吗?不知什么原因,这让我发狂 这是我结构糟糕的代码: numTimes = dict() target = (len(a)//2)+1

这是我在作业中遇到的一个问题:

编写一个函数majority(a),返回a中至少出现len(a)//2+1次的值。如果在中不存在这样的元素,则此函数返回None

作业中的想法是想出尽可能快的方法

我的想法是保留一个包含每个元素计数的字典,然后在字典中循环查看是否有任何元素的计数为len(a)//2+1

但这似乎并不奏效。有人能给我一个更好的解决方案并解释给我听吗?不知什么原因,这让我发狂

这是我结构糟糕的代码:

numTimes = dict()

target = (len(a)//2)+1
for i in range(0, len(a)):
    numTimes[str(a[i])] += 1

for k, v in numTimes.iteritems():
    if v==str(target):
        return v

return None

当我试图添加一个新的字典元素时,我发现了一个关键错误,尽管这与问题无关。

首先,请考虑<代码> LeN(list)// 2+1 < /> >意味着所讨论的元素将需要是列表的大部分。只能有一个值或没有满足此条件的值

你使用字典的感觉是正确的。可以将每个元素的值映射到每个元素的计数。如果任何元素的计数大于
len(list)//2+1
,这就是您的答案

下面是计算列表中元素的最简单方法(至少不使用库):

注意两件事。由于您最终会将
li
的每个值设置为0,因此您可以将该部分简化为使用一个集合的方法一次性设置它们:

count={}.fromkeys(set(li),0)
您还可以查看在添加元素时是否获得多数票:

def majority2(li):
    ''' test list li if any single element occurs in li more than len(li)//2+1 times '''
    count={}.fromkeys(set(li),0)
    tgt=len(li)//2+1
    # count each element in li:
    for key in li:
        count[key]+=1 
        if count[key]>=tgt:
            return key
    return None     
测试:

>>> a=['1']*10+['2']*11
>>> majority(a)
{'1': 10, '2': 11}
'2'
>>> majority2(a)
'2'
>>> a=['1']*10+['2']*10
>>> majority2(a)
None

首先,考虑<代码> LeN(list)// 2 + 1 < /COD>意味着所讨论的元素将需要是列表的大部分。只能有一个值或没有满足此条件的值

你使用字典的感觉是正确的。可以将每个元素的值映射到每个元素的计数。如果任何元素的计数大于
len(list)//2+1
,这就是您的答案

下面是计算列表中元素的最简单方法(至少不使用库):

注意两件事。由于您最终会将
li
的每个值设置为0,因此您可以将该部分简化为使用一个集合的方法一次性设置它们:

count={}.fromkeys(set(li),0)
您还可以查看在添加元素时是否获得多数票:

def majority2(li):
    ''' test list li if any single element occurs in li more than len(li)//2+1 times '''
    count={}.fromkeys(set(li),0)
    tgt=len(li)//2+1
    # count each element in li:
    for key in li:
        count[key]+=1 
        if count[key]>=tgt:
            return key
    return None     
测试:

>>> a=['1']*10+['2']*11
>>> majority(a)
{'1': 10, '2': 11}
'2'
>>> majority2(a)
'2'
>>> a=['1']*10+['2']*10
>>> majority2(a)
None
我会使用图书馆。它是dict的一个子类

from collections import Counter

def majority(iterable):
    c = Counter(iterable)
    value, count = c.most_common(1)[0]
    target = (len(iterable)//2) + 1
    if (count >= target):
        return value
    else:
        return None
我会使用图书馆。它是dict的一个子类

from collections import Counter

def majority(iterable):
    c = Counter(iterable)
    value, count = c.most_common(1)[0]
    target = (len(iterable)//2) + 1
    if (count >= target):
        return value
    else:
        return None

我发现最有效的方法是:

numTimes = dict()
target = (len(a)//2)+1

for ele in a:
    if ele not in numTimes:
        numTimes[ele] = 1
    else:
        numTimes[ele] +=1

    if numTimes[ele] == target:
        return ele

当我们添加时,我们可以检查次数是否等于目标中点。

我发现最有效的方法是:

numTimes = dict()
target = (len(a)//2)+1

for ele in a:
    if ele not in numTimes:
        numTimes[ele] = 1
    else:
        numTimes[ele] +=1

    if numTimes[ele] == target:
        return ele

添加时,我们可以检查次数是否等于目标中点。

有趣的问题!你能举一个字典的例子吗?在不知道数据是如何构造的情况下,很难回答一个关于数据构造的问题。为什么要测试计数作为数字是否等于目标作为字符串?你使用的是什么版本的Python?2.7和3.x有一个
collections.Counter
类,如果你的作业没有禁止,它可以简化这个类。如果我在写作业的话,我会这么做,因为那堂课让这个问题变得非常琐碎、有趣!你能举一个字典的例子吗?在不知道数据是如何构造的情况下,很难回答一个关于数据构造的问题。为什么要测试计数作为数字是否等于目标作为字符串?你使用的是什么版本的Python?2.7和3.x有一个
collections.Counter
类,如果你的作业没有禁止,它可以简化这个类。如果我在写作业的话,我会这么做,因为那个类让这件事变得非常琐碎。(下一票是为了风格,不具体的变量名,没有注释。)@stalepretzel:你说得对。我实质性地改变了它。谢谢你的建设性反馈。啊,酷。不再值得投否决票,删除否决票!:)当我们谈到风格时,我可能应该插入PEP 8()(下一票是指风格、不具体的变量名、缺少注释)。@stalepretzel:你说得对。我实质性地改变了它。谢谢你的建设性反馈。啊,酷。不再值得投否决票,删除否决票!:)当我们谈到风格时,我可能应该插入pep8()。我不允许使用任何库。我不允许使用任何库。