在Python中,当按一个值排序然后按另一个值排序时,如何保存分组?

2024-09-24 22:27:18 发布

您现在位置:Python中文网/ 问答频道 /正文

数据如下:

Idx评分组
5 0.85欧洲
8 0.77澳大利亚
12 0.70南美洲
13 0.71澳大利亚
42 0.82欧洲
45 0.90亚洲
65 0.91亚洲
73 0.72南美洲
77 0.84亚洲

需要看起来像这样:

Idx评分组
65 0.91亚洲
77 0.84亚洲
45 0.73亚洲
12 0.87南美洲
73 0.72南美洲
5 0.85欧洲
42 0.82欧洲
8 0.83澳大利亚
13 0.71澳大利亚

看看亚洲得分最高的是什么,它向我展示了亚洲的所有得分,然后是得分第二的小组,依此类推?我需要用Python来做这个。这与按一个元素排序然后再按另一个元素排序大不相同。请帮忙。抱歉,如果这个问题是多余的。我几乎不知道该怎么问,更不用说寻找了。在

我把它作为一个字典,所以dict={5:[0.85,欧洲],8:[0.77,澳大利亚]…}我做了一个函数,试图解析数据:

def sortResults(dict):
   newDict = {}
   for k,v in dict.items():
      if v[-1] in newDict:
         sorDic[v[-1]].append((k,float(v[0]),v[1]))
      else:
         newDict[v[-1]] = [(k,float(v[0]),v[1])]
   for k in newDict.keys():
      for resList in newDict[k]:
         resList = sorted(resList,key=itemgetter(1),reverse=True)
   return sorDic

上面写着浮动不可预订…我只是有点困惑。在


Tags: 数据函数in元素for字典排序小组
3条回答

我认为最简单的方法是先按组进行分类,然后分两步进行排序(第一步按组最大值排序,第二步按组内得分排序)。在

data = [[ 5, 0.85, "Europe"],
        [ 8, 0.77, "Australia"],
        [12, 0.70, "S.America"],
        [13, 0.71, "Australia"],
        [42, 0.82, "Europe"],
        [45, 0.90, "Asia"],
        [65, 0.91, "Asia"],
        [73, 0.72, "S.America"],
        [77, 0.84, "Asia"]]

groups = {}
for idx, score, group in data:
    try:
        groups[group].append((idx, score, group))
    except KeyError:
        groups[group] = [(idx, score, group)]

for group in sorted((group for group in groups.keys()),
                    key = lambda g : -max(x[1] for x in groups[g])):
    for idx, score, group in sorted(groups[group], key = lambda g : -g[1]):
        print idx, score, group

最终结果是

^{pr2}$

这与您提供的不同,但是对于您问题中的结果,我认为您有一个输入错误,因为S.America的分数0.87在输入数据中不存在。在

我只需要用每个组的最大值填充一个字典,然后按组最大值和个人分数排序。像这样:

data = [
  (5 , 0.85, "Europe"),
  (8 , 0.77, "Australia"),
  (12, 0.70, "S.America"),
  (13, 0.71, "Australia"),
  (42, 0.82, "Europe"),
  (45, 0.90, "Asia"),
  (65, 0.91, "Asia"),
  (73, 0.72, "S.America"),
  (77, 0.84, "Asia")
]

maximums_by_group = dict()

for indx, score, group in data:
    if group not in maximums_by_group or maximums_by_group[group] < score:
        maximums_by_group[group] = score

data.sort(key=lambda e: (maximums_by_group[e[2]], e[1]), reverse=True)

for indx, score, group in data:
    print indx, score, group

这将产生

^{pr2}$

我认为有一种比我这里的更好的迭代方法,但这是可行的:

from operator import itemgetter

dataset = [
    { 'idx': 5, 'score': 0.85, 'group': 'Europe' },
    { 'idx': 8, 'score': 0.77, 'group': 'Australia' },
    { 'idx': 12, 'score': 0.70, 'group': 'S.America' },
    { 'idx': 13, 'score': 0.71, 'group': 'Australia' },
    { 'idx': 42, 'score': 0.82, 'group': 'Europe' },
    { 'idx': 45, 'score': 0.90, 'group': 'Asia' },
    { 'idx': 65, 'score': 0.91, 'group': 'Asia' },
    { 'idx': 73, 'score': 0.72, 'group': 'S.America' }
]

score_sorted = sorted(dataset, key=itemgetter('score'), reverse=True)

group_score_sorted = []
groups_completed = []
for score in score_sorted:
    group_name = score['group']
    if not group_name in groups_completed:
        groups_completed.append(group_name)

        for group in score_sorted:
            if group['group'] = group_name:
                group_score_sorted.append(group)

#group_score_sorted now contains sorted list

相关问题 更多 >