Как отсортировать список в обратном порядке по "paid"?

Bestcontrol

Новичок
Пользователь
Дек 25, 2020
3
0
1
Имеется такой вот код, по чтению лога и вывода на экран суммы. Результат выводится списком, нужно же его отсортировать в обратном порядке по paid. Как это возможно сделать?

Python:
import json



# log file name

import sys



FileName = "test.log.1"



def CalculateCodeStats(codeStats, jsonObject, userId = 0):

    if "code" in jsonObject:

        if userId != 0:

            if "id_login" not in jsonObject:

                return codeStats



            if jsonObject["id_login"] != userId:

                return codeStats



        if jsonObject["code"] in codeStats:

            codeStats[jsonObject["code"]]["arm"] += 1

        else:

            codeStats[jsonObject["code"]] = {

                "arm": 1,

                "bonus": 0,

                "paid": 0

            }



        if "data" in jsonObject and  isinstance(jsonObject["data"], dict) is True:

            if "bonus" in jsonObject["data"]:

                codeStats[jsonObject["code"]]["bonus"] += jsonObject["data"]["bonus"]

            if "paid" in jsonObject["data"]:

                codeStats[jsonObject["code"]]["paid"] += jsonObject["data"]["paid"]

    return codeStats



if __name__ == "__main__":

    args = sys.argv[1:]

    userId = 0 if len(args) == 0 else int(sys.argv[1:][0])



    loglines = []

    codeStats = {}



    print('Reading file...')

    with open(FileName, 'r') as logfile:

        loglines = logfile.read().splitlines()

    print('Read successful!')



    print('Started parsing...')

    for line in loglines:

        splitted = line.split('conflict: ')

        if len(splitted) > 1:

            jsonString = splitted[1]



            try:

                jsonObject = json.loads(jsonString)

            except Exception as e:

                print(f'Cannot unmarshall line "{line}"\nError: {e}')

                continue



            codeStats = CalculateCodeStats(codeStats, jsonObject, userId)

    print('Success!')

    for stat in codeStats:

        print(f'{stat}: {codeStats[stat]}')

    pass
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Код вставляйте с помощью ... -> код -> Python. Без отступов трудно разобраться.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Результат выводится списком, нужно же его отсортировать в обратном порядке по paid.
Покажите пример списка.
 

Bestcontrol

Новичок
Пользователь
Дек 25, 2020
3
0
1
Покажите пример списка.
Код:
109: {'arm': 267, 'bonus': 0, 'paid': 198550},
110: {'arm': 267, 'bonus': 0, 'paid': 0},
101: {'arm': 5565, 'bonus': 714731, 'paid': 6159},
102: {'arm'': 5565, 'bonus': 0, 'paid': 0},
38: {'arm': 3620, 'bonus': 0, 'paid': 0},
39: {'arm': 3620, 'bonus': 69750, 'paid': 0},
131: {'arm': 734, 'bonus': 725769, 'paid': 11631},
132: {'arm': 734, 'bonus': 0, 'paid': 0},
93: {'arm': 4807, 'bonus': 231350, 'paid': 9000},
на данный момент получается так, а нужно в обратном порядке с сортировкой по paid
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
на данный момент получается так, а нужно в обратном порядке с сортировкой по paid
Вот пример:
Python:
codeStats = {
    109: {'arm': 267, 'bonus': 0, 'paid': 198550},
    110: {'arm': 267, 'bonus': 0, 'paid': 0},
    101: {'arm': 5565, 'bonus': 714731, 'paid': 6159},
    102: {'arm': 5565, 'bonus': 0, 'paid': 0},
    38: {'arm': 3620, 'bonus': 0, 'paid': 0},
    39: {'arm': 3620, 'bonus': 69750, 'paid': 0},
    131: {'arm': 734, 'bonus': 725769, 'paid': 11631},
    132: {'arm': 734, 'bonus': 0, 'paid': 0},
    93: {'arm': 4807, 'bonus': 231350, 'paid': 9000}
}

codeStats = dict(sorted(codeStats.items(), key=lambda item: item[1]['paid']))


for stat in codeStats:
    print(f'{stat}: {codeStats[stat]}')
 

Bestcontrol

Новичок
Пользователь
Дек 25, 2020
3
0
1
Вот пример:
Python:
codeStats = {
    109: {'arm': 267, 'bonus': 0, 'paid': 198550},
    110: {'arm': 267, 'bonus': 0, 'paid': 0},
    101: {'arm': 5565, 'bonus': 714731, 'paid': 6159},
    102: {'arm': 5565, 'bonus': 0, 'paid': 0},
    38: {'arm': 3620, 'bonus': 0, 'paid': 0},
    39: {'arm': 3620, 'bonus': 69750, 'paid': 0},
    131: {'arm': 734, 'bonus': 725769, 'paid': 11631},
    132: {'arm': 734, 'bonus': 0, 'paid': 0},
    93: {'arm': 4807, 'bonus': 231350, 'paid': 9000}
}

codeStats = dict(sorted(codeStats.items(), key=lambda item: item[1]['paid']))


for stat in codeStats:
    print(f'{stat}: {codeStats[stat]}')
Спасибо вам огромное, получилось как надо, я сам так и не смог правильно написать через лямбду сортировку списка.
 

Форум IT Специалистов