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

时间:2018-01-01 15:29:57

标签: 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 = set(somelist)
        return nsmallest(3, lowest_unique)

它产生输出:

[5.00000009, 5.000007, 5.0000075]

现在我想要一个单独的函数来告诉我原始列表中最常出现的三个最低值中的哪一个。

所以我希望它告诉我5.0000075是原始列表中lowest_three列表中最常见的数字(somelist)。

我已经尝试了以下但它不起作用(它当前产生5.00099的输出,甚至不在lowest_three列表中。

def most_common_lowest(somelist):
        for x in lowest_three(somelist):
                return max(set(somelist), key=somelist.count)

如何实现这一目标?

8 个答案:

答案 0 :(得分:2)

  

现在我想要一个单独的函数来告诉我原始列表中最常出现的三个最低值中的哪一个。

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)

答案 1 :(得分:1)

您可以使用collections.Counter()收集计数,somelist中仅存在来自top_three的值,然后获取此most_common

from heapq import nsmallest
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]

def lowest_three(somelist):
    lowest_unique = set(somelist)
    return nsmallest(3, lowest_unique)

top_three = lowest_three(somelist)
# [5.00000009, 5.000007, 5.0000075]

freqs = Counter(x for x in somelist if x in top_three)
# Counter({5.0000075: 3, 5.000007: 1, 5.00000009: 1})

print(freqs.most_common(1)[0][0])
# 5.0000075

O您可以将它们分组到collections.defaultdict,并手动取最大值:

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

答案 2 :(得分:0)

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

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

https://www.tutorialspoint.com/python/list_min.htm

答案 3 :(得分:0)

根据lowest_three返回的列表,您可以使用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

答案 4 :(得分:0)

一种选择是使用collections.Counter

from collections import Counter

counts = Counter(somelist)
lowest = lowest_three(somelist)

for num in lowest:
  print counts[num]

答案 5 :(得分:0)

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

一个简单的算法:

  1. 创建一个仅包含3个元素的地图(您已经找到),作为键,0作为值。

  2. 遍历数组并且如果地图包含他,则运行数组chack中的每个元素,如果它的值为1(map [key] = map [key] +1)。

  3. 遍历地图并找到值最高的密钥。

  4. (它就像一个计数器数组,但有地图数据结构)

答案 6 :(得分:0)

使用收集模块中的计数器并使用有序函数,两次获取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)

答案 7 :(得分:0)

每个人都建议你收集模块,你可以不用收集而在几行中,你走了:

(3, 5.0000075)

输出:

sudo nano ~/.bashrc