Python:列表中的最小数字,包括重复数字

时间:2017-04-13 07:06:48

标签: python list

有点像python的新手,我在解决这个问题时遇到了麻烦。

假设我有一个列表A并假设我想返回一个包含至少三个最小值的列表B,包括重复值。我该如何为此编写逻辑?关于如何将这种思想转化为代码,我感到有些失落。

示例:

    A = [1,2,3,4,4]
    b = [1,2,3]

    A = [1,2,3,3,4]
    B = [1,2,3,3]

    A = [1,1,2,2,3]
    B = [1,1,2,2]

    A = [1,1,2,3]
    B = [1,1,2]

4 个答案:

答案 0 :(得分:2)

您可以使用heapq模块:

import heapq

def nsmallestwithrepeats(A, n=3):
    b = heapq.nsmallest(n, A)
    try:
        b = set(b)
    except TypeError:
        pass
    return [a for a in A if a in b]

for A in [1,2,3,4,4], [1,2,3,3,4], [1,1,2,2,3], [1,1,2,3]:
    print(nsmallestwithrepeats(A))

输出:

[1, 2, 3]
[1, 2, 3, 3]
[1, 1, 2, 2]
[1, 1, 2]

正如@MathieuBandleé指出的那样,而不是形成一个集合,简单地比较b的最大元素可能更有效:

def nsmallestwithrepeats(A, n=3):
    b = heapq.nsmallest(n, A)
    return [a for a in A if a <= b[-1]]

答案 1 :(得分:2)

我们可以使用set获取不同的值,然后保持最小值3。 然后我们只保留A中属于这3个值的值。

def smallest_3_with_repeats(A):
    smallest_distinct = sorted(list(set(A)))[:3]
    return [x for x in sorted(A) if x in smallest_distinct] 

for A in [[1,2,3,4,4], [1,2,3,3,4], [1,1,2,2,3],
          [1,1,2,3],[1, 1, 1, 2, 3, 4] ] :
    print(A, "-->", smallest_3_with_repeats(A))

#[1, 2, 3, 4, 4] --> [1, 2, 3]
#[1, 2, 3, 3, 4] --> [1, 2, 3, 3]
#[1, 1, 2, 2, 3] --> [1, 1, 2, 2, 3]
#[1, 1, 2, 3] --> [1, 1, 2, 3]
#[1, 1, 1, 2, 3, 4] --> [1, 1, 1, 2, 3]

编辑:正如Paul Pantzer所说,这不是OP所要求的。 我们希望结果中至少有3个值,但不一定都是3个不同的最小值。

所以,一个符合标准的版本:

def smallest_3_with_repeats(A):
    smallest_distinct = sorted(list(set(A)))[:3]
    smallest = []
    for val in smallest_distinct:
        smallest.extend([x for x in A if x == val])
        if len(smallest) >= 3:
            break
    return smallest


for A in [[1,2,3,4,4], [1,2,3,3,4], [1,1,2,2,3],
          [1,1,2,3],[1, 1, 1, 2, 3, 4] ] :
    print(A, "-->", smallest_3_with_repeats(A))

# [1, 2, 3, 4, 4] --> [1, 2, 3]
# [1, 2, 3, 3, 4] --> [1, 2, 3, 3]
# [1, 1, 2, 2, 3] --> [1, 1, 2, 2]
# [1, 1, 2, 3] --> [1, 1, 2]
# [1, 1, 1, 2, 3, 4] --> [1, 1, 1]

答案 2 :(得分:0)

我个人这样做:

def get_mins(my_list, how_many):
    sorted_list = sorted(my_list)
    return [i for i in sorted_list if i != sorted_list[-1]][:how_many]


if __name__ == '__main__':
    print(get_mins([1, 2, 3, 4, 4], 3))
    print(get_mins([1, 2, 3, 3, 4], 4))
    print(get_mins([1, 1, 2, 2, 3], 4))
    print(get_mins([1, 1, 2, 3], 3))
    print(get_mins([1, 1, 1, 2, 3, 4], 4))

输出将是:

[1, 2, 3]
[1, 2, 3, 3]
[1, 1, 2, 2]
[1, 1, 2]
[1, 1, 1, 2]

没什么好看的,也不需要额外的模块。

该函数有两个参数:

  • 您的清单
  • 您在新列表中需要多少个值

该函数使用list comprehension并将所有与最大值不同的值添加到新列表中(在我们的例子中,是sorted_list的最后一个元素)。

答案 3 :(得分:0)

没有多少经验的python ...但这似乎工作.. 如果A []未排序,您也可以使用排序(A)

A = [1,1,2,2,2,3]
B = []
count = 0
i = 0
while count<3 or A[i] == A[i-1]:
    B.append(A[i])
    i = i+1
    count = count + 1
print B