【问题标题】:Finding the 5 smallest numbers from a list in Python [closed]从 Python 中的列表中查找 5 个最小的数字 [关闭]
【发布时间】:2015-08-29 05:04:42
【问题描述】:

我有一个名称列表 x 和一个分数列表 y,它们对应于这些名称。

x = {a,b,c,d,e,f,g,h,i,j,k} 
y= {8,8,15,13,12,17,18,12,14,14} 

所以,a 得 8 分,b 得 8 分,c 得 15 分,...,k 得 14 分

我想从列表中找出 5 个最小的分数,y,并获取他们的名字并打印出类似于以下内容:

前5名最低分:

a : 8
b : 8 
e : 12
h : 12 
d : 13

目前,我正在创建列表的副本,然后使用 pop 来不断减少列表,但它给我的分数名称不正确。但是,当我为 max5 值创建列表时,使用相同的方法一切都很好。我不确定让我在 python 中执行此操作的函数。这只是我的问题的一个示例,我的真正问题涉及商店位置以及我从函数计算的那些商店的分数,但我想获得前 5 个最高分和 5 个最低分。有没有人对此有有效的解决方案?

【问题讨论】:

  • 你的数据结构不对。使用字典。
  • x = {1, 3, 4, 5} 是一个集合,它的元素具有随机顺序,不像列表。

标签: python sorting max minimum


【解决方案1】:

Python 有一个名为 Dictionary 的数据结构,您可以使用它来存储键/值对。在 Python 中,字典定义为 -

dict = {'a':8 , 'b':8, 'c':15, 'd':13 ...}

然后你可以遍历这个字典中的键值对来找到最小的 5 个数字。

你可以将dict转换为元组,然后根据第二项对元组进行排序-

import operator
dict = {'a':8 , 'b':8, 'c':15, 'd':13 ...}
sorted_dict = sorted(dict.items(), key=operator.itemgetter(1))

您也可以使用list of tuples,而不是使用字典,并使用上面代码中的最后一行根据每个元组的第二个元素对其进行排序。

元组列表看起来像 -

scores = [('a',8),('b',8),('c',15),('d',13)..]

【讨论】:

    【解决方案2】:

    首先,整理你的输入集合

    假设您输入了xy,其中每个分别是标签和分数的集合:

    x = ['a','b','c','d','e','f','g'] 
    y = [5,3,10,2,2,1,0]
    

    要将x按对应的分数y排序,将它们压缩在一起并按分数排序,取前5个就可以了:

    min_list = sorted(zip(x,y), key=lambda t: t[1])[5:]
    

    快速解释

    它将 x 和 y 压缩在一起,所以你有一个列表 zip(x,y) = ('a',5), ('b',3), ...

    然后按每个元组的第二个元素对该列表进行排序 排序( zip(x,y )) 其中排序的关键是元组的第二个元素 (t[1])

    最后,取排序列表的前 5 个元素 [5:]

    您的结果集合如下所示:

    [('g', 0), ('f', 1), ('d', 2), ('e', 2), ('b', 3)]
    

    【讨论】:

    • 非常感谢,那么如果说我想打印:'f': 1 我将如何调用字典?打印 min_list[1][0], ':', 'min_list[1][1]?
    • 如果我想做最大值,我会做 min_list = sorted(zip(x,y), key=lambda t: t[1])[:5] 而不是 min_list = sorted (zip(x,y), key=lambda t: t[1])[5:]
    • 实际上,Python 中有很多内置函数可以完成您的工作。要在列表中查找最大值,您可以执行以下操作:max(zip(x,y), key:lambda t: t[1])
    【解决方案3】:

    首先,{8,8,15...} 会创建一个set,而不是list;由于套装没有排序,您不能像这样将 2 个套装配对在一起。

    这样你就有了

    x = ['a','b','c','d','e','f','g','h','i','j','k'] 
    y = [8, 8, 15, 13, 12, 17, 18, 12, 14, 14]
    

    现在,要将它们组合成 letter, score 对,请使用 zip 函数。

    pairs = zip(x, y)
    

    然后你可以从heapq 模块中找到n 个具有恰当命名nsmallest 函数的最小项目;您需要提供一个自定义的key 函数,该函数将为每个项目提供分数;我们将为此使用operator.itemgetter(1)(它将为每个letter, score 对返回元素1score

    from operator import itemgetter
    from heapq import nsmallest
    
    result = nsmallest(5, pairs, key=itemgetter(1))
    print(result)
    

    打印出来

    [('a', 8), ('b', 8), ('e', 12), ('h', 12), ('d', 13)]
    

    要仅获取字母,只需添加:

    letters = [ i[0] for i in result ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多