在Python中查找列表中的5个最小数字

时间:2015-06-13 06:21:33

标签: python sorting max minimum

我有一个名单列表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,并得到他们的名字,并打印出与以下类似的内容:

top5最低分:

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

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

3 个答案:

答案 0 :(得分:7)

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代替使用dict,并使用上面代码中的最后一行根据每个元组的第二个元素对其进行排序。

元组列表看起来像 -

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

答案 1 :(得分:2)

首先,整理您的输入集

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

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

要按相应的分数xy进行排序,将它们压缩并按分数排序,取前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)]

答案 2 :(得分:1)

首先,list会创建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;由于集合没有排序,你不能像这样配对2套。

因此你有

zip

现在,要将这些变为pairs = zip(x, y) 对,请使用heapq函数。

key

然后您可以从operator.itemgetter(1)模块中找到具有恰当名称nsmallest函数的 n 个最小项目;您需要提供自定义1功能,以便为每个项目提供分数;我们会使用score(它会为每个letter, score对返回元素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 ]

打印出来

<ListView
      android:id="@+id/subCategory"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="5"
      android:cacheColorHint="@android:color/transparent"
      android:divider="#fff"
      android:dividerHeight="1dp"
      android:fadingEdge="none">
 </ListView>

要获取字母,只需添加:

public class ListAdapter extends BaseAdapter {

    private ArrayList<String>   mData   = new ArrayList<String>();
    private LayoutInflater      mInflater;

    public MobileListAdapter(Activity activity) {
        mInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addItem(String item) {
        mData.add(item);
        notifyDataSetChanged();
    }

    public int getCount() {
        return mData.size();
    }

    public String getItem(int position) {
        return mData.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.mobile_page, parent, false);
            holder.textView = (TextView) convertView.findViewById(R.id.text);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        String str = mData.get(position);
        holder.textView.setText(str);
        return convertView;
    }

    public class ViewHolder {
        public TextView textView;
    }

}