python 按值然后键对字典项目进行排序
python sort dictionary items by value and then key
全部,
我很难按值对字典进行排序然后打印。
我的对象(数据集)如下所示...
dict_items([(0, {'studentName': 'dan', 'Score': 80.0}), (1, {'studentName': 'rob', 'Score': 92.0})])
我想按分数排序并打印,但我失败得很惨。我按照建议使用了以下方法按学生姓名排序,如果有帮助的话。
entries = sorted([(dataSet[entry]['studentName'], dataSet[entry]['Score']) for entry in dataSet])
for name, score in entries:
print(('Student: {} -- Score: {}%'.format(name, score)))
如果您只需要一个按分值排序的键列表:
d = {0: {'Score': 80.0, 'studentName': 'dan'},
1: {'Score': 92.0, 'studentName': 'rob'},
2: {'Score': 10.0, 'studentName': 'xyz'}}
sorted(d, key=lambda k: d[k]['Score'])
生产
[2, 0, 1]
否则,您可以使用有序字典
from collections import OrderedDict
od = OrderedDict(sorted(d.items(), key=lambda i: i[1]['Score']))
这给了你
OrderedDict([(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob'})])
你可以很好地打印出来
for v in od.values():
print(v['Score'], v['studentName'])
10.0 xyz
80.0 dan
92.0 rob
假设您的对象是 list
of tuples
of dicts
(我可以通过给定的数据得出的最接近的解释),这就足够了:
>>> dict_items = [(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob'
})]
>>> sorted(dict_items, key=lambda x: x[1]['Score'])
# [(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob'
})]
MyDict = {0: {'Score': 80.0, 'studentName': 'dan'},
1: {'Score': 92.0, 'studentName': 'rob'},
2: {'Score': 10.0, 'StudentName': 'xyz'}}
这return是字典中键值对的列表,按值从高到低排序:
sorted(MyDict.items(), key=lambda x: x[1], reverse=True)
对于按键排序的字典,使用如下:
sorted(MyDict.items(), reverse=True)
return是一个元组列表,因为字典本身无法排序。
这可以打印或发送到进一步的计算。
另一种方法在下面,也许有人需要:
d = {0: {'Score': 80.0, 'studentName': 'dan'},
1: {'Score': 92.0, 'studentName': 'rob'},
2: {'Score': 10.0, 'StudentName': 'xyz'}}
sorted(d, cmp = lambda a,b: cmp(d[a]['Score'],d[b]['Score']))
我只会使用:
def comp(x,y):
if x[1]['Score'] != y[1]['Score']:
return 1 if x[1]['Score'] > y[1]['Score'] else -1
elif x[1]['studentName'] < y[1]['studentName']:
return -1
elif x[1]['studentName'] > y[1]['studentName']:
return 1
else:
return 0
然后
sorted(dict_items, comp)
例如
dict_items = [(0, {'Score': 80.0, 'studentName': 'dan'}),
(1, {'Score': 92.0, 'studentName': 'rob'}),
(2, {'Score': 70.0, 'studentName': 'foo'})]
它给出:
[(2, {'Score': 70.0, 'studentName': 'foo'}), (0, {'Score': 80.0, 'studentName': 'dan'}),
(1, {'Score': 92.0, 'studentName': 'rob'})]
但是注意:你的问题标题是关于dictionnary项的。答案与问题中的代码一致,但仅对元组列表进行排序。如果你真的有字典d
,你应该使用sorted(d.items())
全部,
我很难按值对字典进行排序然后打印。
我的对象(数据集)如下所示...
dict_items([(0, {'studentName': 'dan', 'Score': 80.0}), (1, {'studentName': 'rob', 'Score': 92.0})])
我想按分数排序并打印,但我失败得很惨。我按照建议使用了以下方法按学生姓名排序,如果有帮助的话。
entries = sorted([(dataSet[entry]['studentName'], dataSet[entry]['Score']) for entry in dataSet])
for name, score in entries:
print(('Student: {} -- Score: {}%'.format(name, score)))
如果您只需要一个按分值排序的键列表:
d = {0: {'Score': 80.0, 'studentName': 'dan'},
1: {'Score': 92.0, 'studentName': 'rob'},
2: {'Score': 10.0, 'studentName': 'xyz'}}
sorted(d, key=lambda k: d[k]['Score'])
生产
[2, 0, 1]
否则,您可以使用有序字典
from collections import OrderedDict
od = OrderedDict(sorted(d.items(), key=lambda i: i[1]['Score']))
这给了你
OrderedDict([(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob'})])
你可以很好地打印出来
for v in od.values():
print(v['Score'], v['studentName'])
10.0 xyz
80.0 dan
92.0 rob
假设您的对象是 list
of tuples
of dicts
(我可以通过给定的数据得出的最接近的解释),这就足够了:
>>> dict_items = [(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob'
})]
>>> sorted(dict_items, key=lambda x: x[1]['Score'])
# [(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob'
})]
MyDict = {0: {'Score': 80.0, 'studentName': 'dan'},
1: {'Score': 92.0, 'studentName': 'rob'},
2: {'Score': 10.0, 'StudentName': 'xyz'}}
这return是字典中键值对的列表,按值从高到低排序:
sorted(MyDict.items(), key=lambda x: x[1], reverse=True)
对于按键排序的字典,使用如下:
sorted(MyDict.items(), reverse=True)
return是一个元组列表,因为字典本身无法排序。
这可以打印或发送到进一步的计算。
另一种方法在下面,也许有人需要:
d = {0: {'Score': 80.0, 'studentName': 'dan'},
1: {'Score': 92.0, 'studentName': 'rob'},
2: {'Score': 10.0, 'StudentName': 'xyz'}}
sorted(d, cmp = lambda a,b: cmp(d[a]['Score'],d[b]['Score']))
我只会使用:
def comp(x,y):
if x[1]['Score'] != y[1]['Score']:
return 1 if x[1]['Score'] > y[1]['Score'] else -1
elif x[1]['studentName'] < y[1]['studentName']:
return -1
elif x[1]['studentName'] > y[1]['studentName']:
return 1
else:
return 0
然后
sorted(dict_items, comp)
例如
dict_items = [(0, {'Score': 80.0, 'studentName': 'dan'}),
(1, {'Score': 92.0, 'studentName': 'rob'}),
(2, {'Score': 70.0, 'studentName': 'foo'})]
它给出:
[(2, {'Score': 70.0, 'studentName': 'foo'}), (0, {'Score': 80.0, 'studentName': 'dan'}),
(1, {'Score': 92.0, 'studentName': 'rob'})]
但是注意:你的问题标题是关于dictionnary项的。答案与问题中的代码一致,但仅对元组列表进行排序。如果你真的有字典d
,你应该使用sorted(d.items())