python根据值对字典排序

时间:2019-03-06 10:54:33

标签: python dictionary

我将csv加载到pandas数据框中,如下所示:

TYPE    BENEFIT_CATEGORY    FORMULA TEXT_1              MULTIPLIER  TEXT_2
A       MATH                Y       You can earn up to  50          Rs per year
A       SCIENCE             Y       You can earn up to  100         Rs per year
A       TOTAL               Y       You can earn up to  200         Rs per year
A       SOCIAL              Y       You can earn up to  50          Rs per year
B       SOCIAL              Y       You can earn up to  20          Rs per year
B       MATH                Y       You can earn up to  10          Rs per year
B       TOTAL               Y       You can earn up to  30          Rs per year

我有以下代码来创建字典:

   def cc_benefits(df_benefit):
    benefits = {}
    for row in df_benefit.itertuples():
        if row.FORMULA == 'N':
            description = str(row.TEXT_1)
        else:
            string = str(row.TEXT_1)
            formula = row.MULTIPLIER
            description = string + " " + str(formula) + " " + str(row.TEXT_2)
        if row.TYPE in benefits:
            benefits[row.TYPE].append({
                'Name': row.BENEFIT_CATEGORY,
                'Description': description,
                'value' : formula
                 })
        else:
            benefits[row.TYPE] = [
                {
                    'Name': row.BENEFIT_CATEGORY,
                    'Description': description,
                    'value' : formula
                }
              ] 
    # as suggested by @skaul
    benefits = sorted(benefits, key=lambda k: int(k['value']),reverse = True) 
    for i in benefits:
        del i['value']
    # as suggested by @skaul
    return benefits

称为

benefits = cc_benefits(df_benefit)
benefits['A']

返回:

[{'Name': 'MATH',
  'Description': 'You can earn up to 50 Rs per year',
  'value': 50},
 {'Name': 'SCIENCE',
  'Description': 'You can earn up to 100 Rs per year',
  'value': 100},
 {'Name': 'TOTAL',
  'Description': 'You can earn up to 200 Rs per year',
  'value': 200},
 {'Name': 'SOCIAL',
  'Description': 'You can earn up to 50 Rs per year',
  'value': 50}]

但是我想要按排序顺序(按“值”并删除“值”并显示为)

[{'Name': 'TOTAL',
  'Description': 'You can earn up to 200 Rs per year'},
 {'Name': 'SCIENCE',
  'Description': 'You can earn up to 100 Rs per year'},
{'Name': 'MATH',
  'Description': 'You can earn up to 50 Rs per year'},
 {'Name': 'SOCIAL',
  'Description': 'You can earn up to 50 Rs per year'}]

我不确定,是否可能?还需要一种pythonic的方法吗? 任何帮助都受到高度赞赏吗?

3 个答案:

答案 0 :(得分:0)

df_benefits.sort(['MULTIPLIER'],ascending=True)
df_benefits.drop(columuns='value')

如果在将其转换为字典之前运行此命令,则应该对其进行排序且没有值。

您还应该在for循环中删除“值”

已更新

答案 1 :(得分:0)

尝试以下代码:

x = [{"Name":"MATH","Description":"You can earn up to 50 Rs per year","value":50},{"Name":"SCIENCE","Description":"You can earn up to 100 Rs per year","value":100},{"Name":"TOTAL","Description":"You can earn up to 200 Rs per year","value":200},{"Name":"SOCIAL","Description":"You can earn up to 50 Rs per year","value":50}]

newlist = sorted(x, key=lambda k: int(k['value']),reverse = True) 
for i in newlist:
    del i['value']

答案 2 :(得分:0)

Maybe you could try defining a function to sort your dictionary :

def sort_dic(d):
    for key, value in sorted(sorted(d.items()), key=itemgetter(1), reverse=True):
yield key, value

Or

def sort_dic(d):
    for key, value in sorted(d.items(), key=lambda a: (-a[1], a[0])):
        yield key, value