Python 在单独的列表中检查一个列表中最常见的值

Python 在单独的列表中检查一个列表中最常见的值,python,list,Python,List,我有一张号码表 somelist = [5.000007,5.00099,5.0000075,5.0000075,5.0000075,5.0000099,5.00099,5.0000080,5.0000081,5.00099,5.0000080,5.0000096,5.0000087,5.008,5.00099,5.00000009] 我使用以下方法生成一个包含3个最低值的唯一列表: def lowest_three(somelist): lowest_unique = se

我有一张号码表

somelist =  [5.000007,5.00099,5.0000075,5.0000075,5.0000075,5.0000099,5.00099,5.0000080,5.0000081,5.00099,5.0000080,5.0000096,5.0000087,5.008,5.00099,5.00000009]
我使用以下方法生成一个包含3个最低值的唯一列表:

def lowest_three(somelist):
        lowest_unique = set(somelist)
        return nsmallest(3, lowest_unique)
它产生以下输出:

[5.00000009, 5.000007, 5.0000075]
现在我需要一个单独的函数来告诉我三个最小值中的哪一个是原始列表中最常见的

def most_common_lowest(somelist):
    for x in lowest_three(somelist):
        return max(set(somelist), key=somelist.count)
所以我想让它告诉我,
5.0000075
是原始列表(
somelist
)中最低的三个
列表中最常见的数字

我尝试了以下方法,但不起作用(它目前产生的输出为
5.00099
,甚至不在
最低的三个
列表中)


如何实现这一点?

您可以使用函数min。它可能会解决您的问题

#!/usr/bin/python
var list = [5.00000009, 5.000007, 5.0000075]
print "min value element : ", min(list)

给定从
最底层返回的列表,您可以使用
list.count

somelist =  [5.000007,5.00099,5.0000075,5.0000075,5.0000075,5.0000099,5.00099,5.0000080,5.0000081,5.00099,5.0000080,5.0000096,5.0000087,5.008,5.00099,5.00000009]
new_list = lowest_three(somelist)
final_data = sorted(new_list, key=lambda x:somelist.count(x))[-1]
输出:

5.0000075
一个选择是使用


您可以使用收集计数,仅使用
somelist
中存在于
top\u three
中的值,然后取以下值:

O您可以将它们分组,并手动获取最大值:

from collections import defaultdict
from operator import itemgetter

filtered_values = [x for x in somelist if x in top_three]
# [5.000007, 5.0000075, 5.0000075, 5.0000075, 5.00000009]

freqs = defaultdict(int)
for val in filtered_values:
    freqs[val] += 1
# defaultdict(<class 'int'>, {5.000007: 1, 5.0000075: 3, 5.00000009: 1})

print(max(freqs.items(), key = itemgetter(1))[0]) # or key = lambda x: x[1]
# 5.0000075
从集合导入defaultdict
从运算符导入itemgetter
过滤的_值=[x代表somelist中的x,如果x位于前三名]
# [5.000007, 5.0000075, 5.0000075, 5.0000075, 5.00000009]
freqs=defaultdict(int)
对于过滤后的值中的val:
频率[val]+=1
#defaultdict(,{5.000007:1,5.0000075:3,5.00000009:1})
打印(max(freqs.items(),key=itemgetter(1))[0])#或key=lambda x:x[1]
# 5.0000075

//我认为你最好自己为这个操作编写一个算法(用于实践)

一个简单的算法:

  • 创建一个只包含这3个元素(您已经找到的元素)作为键,0作为值的地图

  • 在数组上运行,如果map包含元素,则对数组中的每个元素进行检查,如果没有将值加1(map[key]=map[key]+1)

  • 在地图上迭代并找到具有最高值的键


  • (类似于计数器数组,但具有映射数据结构)

    使用集合模块中的计数器并使用排序函数,两次一次获取3个最小元素,第二次获取最大发生元素

    from collections import Counter
    somelist =  [5.000007,5.00099,5.0000075,5.0000075,5.0000075,5.0000099,5.00099,5.0000080,5.0000081,5.00099,5.0000080,5.0000096,5.0000087,5.008,5.00099,5.00000009]
    lowest_three=sorted(Counter(somelist).items(), key=lambda i: i[0])[:3]
    print(sorted(lowest_three,key=lambda i :-i[1])[0])
    
    输出

    (5.0000075, 3)
    
    现在我需要一个单独的函数来告诉我三个最小值中的哪一个是原始列表中最常见的

    def most_common_lowest(somelist):
        for x in lowest_three(somelist):
            return max(set(somelist), key=somelist.count)
    
    那代码没有意义。应该是:

    def most_common_lowest(somelist):
        return max(lowest_three(somelist), key=somelist.count)
    

    每个人都建议您使用采集模块,您可以不用采集,只需几行即可完成,如下所示:

    somelist =  [5.000007,5.00099,5.0000075,5.0000075,5.0000075,5.0000099,5.00099,5.0000080,5.0000081,5.00099,5.0000080,5.0000096,5.0000087,5.008,5.00099,5.00000009]
    
    values=[5.00000009, 5.000007, 5.0000075]
    
    track={}
    for j,i in enumerate(somelist):
        if i in values:
            if i not in track:
                track[i]=1
            else:
                track[i]+=1
    print(max(list(map(lambda x:(track[x],x),track))))
    
    输出:

    (3, 5.0000075)
    

    你的问题没有完全明确。如果最低的三个都出现相同的次数怎么办?你收到的最好的答案将很容易适应这样的极端情况;但你会不公平地拒绝一些解决方案,这些解决方案能满足你的要求,但不能满足你的实际需要。这浪费了每个人的时间,让一些助手感到沮丧,因为他们没有被告知完整的要求。我认为最低的三个不太可能出现相同的次数。真正的列表长度为360个独立的数字。您可以将
    最低的三个()替换为
    排序的(somelist)[:3]
    max(sorted(somelist)[:3],key=somelist.count)
    返回您想要的结果。这很有效,我喜欢它的外观,因为它看起来比其他答案更简单、更有力。我可以澄清一下
    key=somelist.count
    的作用吗?它是否改变了
    max
    的函数,从而找到了最频繁的值,而不是找到最大的数?@treetop是的,不知道为什么其他函数会变得如此复杂或不同,而你几乎已经有了一个很好的解:-)。是的,如果您给
    max
    一个
    key
    函数,那么它会将该函数应用于这些值,并通过计算出的键值来判断它们,在这种情况下,它们出现在
    somelist
    中的频率。
    somelist =  [5.000007,5.00099,5.0000075,5.0000075,5.0000075,5.0000099,5.00099,5.0000080,5.0000081,5.00099,5.0000080,5.0000096,5.0000087,5.008,5.00099,5.00000009]
    
    values=[5.00000009, 5.000007, 5.0000075]
    
    track={}
    for j,i in enumerate(somelist):
        if i in values:
            if i not in track:
                track[i]=1
            else:
                track[i]+=1
    print(max(list(map(lambda x:(track[x],x),track))))
    
    (3, 5.0000075)