我有一个名单列表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个最低分。有没有人有这个有效的解决方案?
答案 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)
首先,整理您的输入集
假设您输入了x
和y
,其中每个都分别是标签和分数的集合:
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)]
答案 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;
}
}