识别列表python中的最不常见的数字

时间:2017-11-03 14:23:11

标签: python python-2.7 python-3.x

使用数字列表,每个数字可以多次出现,我需要在列表中找到最不常见的数字。如果不同的数字具有相同的最低频率,则结果是列表中最后出现的数字。例如,[1,7,2,1,2]中的最小公共整数是7(不是2,如最初所述)。列表需要保持未分类

我有以下内容,但它始终将最后一个条目设置为leastCommon

def least_common_in_unsorted(integers):
    leastCommon = integers[0]
    check = 1
    appears = 1
    for currentPosition in integers:
        if currentPosition == leastCommon:
            appears + 1
        elif currentPosition != leastCommon:
            if check <= appears:
                check = 1
                appears = 1
                leastCommon = currentPosition
    return leastCommon

非常感谢任何帮助

5 个答案:

答案 0 :(得分:3)

使用Counter

from collections import Counter

lst = [1, 7, 2, 1, 2]
cnt = Counter(lst)
mincnt = min(cnt.values())
minval = next(n for n in reversed(lst) if cnt[n] == mincnt)

print(minval) #7

答案 1 :(得分:2)

这是我现在想到的最简单的方法:

a = [1, 7, 2, 1, 2]
c, least = len(a), 0
for x in a:
    if a.count(x) <= c :
        c = a.count(x)
        least = x
least # 7

并且在两个项目中它将返回最后一个项目。

a = [1, 7, 2, 1, 2, 7] # least = 7

答案 2 :(得分:2)

这个答案是基于@offtoffel在选择最后一个出现的项目时合并多个具有相同出现次数的项目:

def least_common(lst):   
    return min(lst, key=lambda x: (lst.count(x), lst[::-1].index(x)))


print(least_common([1,2,1,2]))
# 2

print(least_common([1,2,7,1,2]))
# 7

编辑:我注意到有一个更简单的解决方案,即高效和有效(只需在开头反转列表,min将保留最小值的最后一个值):

def least_common(lst): 
    lst = lst[::-1]
    return min(lst, key=lst.count)


print(least_common([1,2,1,2]))
# 2

print(least_common([1,2,7,1,2]))
# 7

答案 3 :(得分:2)

简短但效率低下:

>>> min(a[::-1], key=a.count)
7

使用collections.Counter的高效版本:

>>> min(a[::-1], key=Counter(a).get)
7

答案 4 :(得分:-1)

def least_common(lst):
    return min(set(lst), key=lst.count)

编辑:对不起,这并不总是采用最少占用的最后一个列表项,如用户所要求的......它适用于示例,但不适用于每个实例。