Сортировка json на основе строковой даты, которая может быть нулевой в python - PullRequest
0 голосов
/ 27 февраля 2020

Привет всем, просто нужна помощь по этому вопросу.

Следующий код работает хорошо, если и до тех пор, пока у даты нет нулевых значений.

Может кто-нибудь помочь мне, пожалуйста

        try:
        import json
        from datetime import datetime
        import re
        import math
    except  Exception as e:
        print("Some modules are missing {} ".format(e))

    data = [
        {
            "name":"Shah",
            "date":"2019-12-07"
        },
        {
            "name":"john",
            "date":"2019-12-05"
        },

        {
            "name":"dave",
            "date":"2019-12-01"
        },
        {
            "name":"dave",
            "date":"null"
        },

    ]


    if __name__ == "__main__":
        sorted_date = sorted(data, key=lambda x: (datetime.strptime(x['date'], '%Y-%m-%d')) )

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Я добавил две опции для этой проблемы.

  • Case1: игнорирование элементов с нулевой датой
  • Case2: сортировка элементов с нулевой датой по имени
from datetime import datetime

data = [
        {
            "name":"Shah",
            "date":"2019-12-07"
        },
        {
            "name":"john",
            "date":"2019-12-05"
        },
        {
            "name":"dave",
            "date":"2019-12-01"
        },
        {
            "name":"dave",
            "date":"null"
        },
        {
            "name":"john",
            "date":"null"
        }
    ]


if __name__ == "__main__":
    # Case1: ignoring elements with null date
    sorted_date = sorted([elem for elem in data if elem["date"]!="null"], key=lambda elem: (datetime.strptime(elem['date'], '%Y-%m-%d')))
    print("Case1 : Ignoring element with null date\n", sorted_date)
    # Case2: Sorting elements with null date by name
    dataWDate = [] #data with date
    dataWODate = [] #data without date
    def listClassification(elem):
        if elem["date"] != "null": 
            dataWDate.append(elem)
        else:
            dataWODate.append(elem)
    [listClassification(elem) for elem in data]
    sorted_date = sorted(dataWDate, key=lambda elem: (datetime.strptime(elem['date'], '%Y-%m-%d'))) + sorted(dataWODate, key=lambda elem: elem['name'])
    print("Case2 : Sorting elements with null date by name\n", sorted_date)
0 голосов
/ 27 февраля 2020

На самом деле вам не нужно время strptime, поскольку ваш формат YYYY-MM-DD:

data = [
    {
        "name":"Shah",
        "date":"2019-12-07"
    },
    {
        "name":"john",
        "date":"2019-12-05"
    },
    {
        "name":"dave",
        "date":"2019-12-01"
    },
    {
        "name":"dave",
        "date":"null"
    },
]


if __name__ == "__main__":
    sorted_date = sorted(data, key=lambda x: x["date"])
    print(sorted_date)

И поскольку в ASCII числа идут перед символами, все даты будут перед строкой «null». Однако это не будет работать, если null представлен пустой строкой. В этом случае вы можете использовать (с ужасным отступом):

data = [
    {
        "name":"Shah",
        "date":"2019-12-07"
    },
    {
        "name":"john",
        "date":"2019-12-05"
    },
    {
        "name":"dave",
        "date":"2019-12-01"
    },
    {
        "name":"dave",
        "date":"null"
    },
]
null_values = {"null", ""}

if __name__ == "__main__":
    sorted_date = sorted(data, key=lambda x: x["date"] if x["date"]
                                             not in null_values else "9999-99-99")
    print(sorted_date)

, если вместо этого вы wi sh отфильтруете нулевые значения, чтобы они даже не появлялись в результатах, тогда генератор путь к go:

sorted_date = sorted((item for item in data if item["date"] not in null_values),
                     key=lambda x: x["date"])
...