-1

Hello everyone just need some help on this issue.

The following code works well unless and until date has no null values.

Can someone help me please

        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')) )
Saurav Saha
  • 745
  • 1
  • 11
  • 30
Soumil Nitin Shah
  • 634
  • 2
  • 7
  • 18
  • _followings code works well unless and until date has no null values_ What happens? Can you clarify your question? The code in your post also needs some fixing. By the way, `except Exception` is bad practice, see https://stackoverflow.com/questions/4990718/about-catching-any-exception. – AMC Feb 27 '20 at 00:06
  • Please fix your indentation and formatting. What do you want to happen for the `"date": "null"` items? – Gino Mempin Feb 27 '20 at 04:25

2 Answers2

1

I have added two options for this problem.

  • Case1: ignoring elements that have null date
  • Case2: sorting elements that have null date by name
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)
Gino Mempin
  • 25,369
  • 29
  • 96
  • 135
charalagou
  • 38
  • 1
  • 7
0

You don't actually need the strptime since your format is 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)

And since in ASCII numbers come before characters, all dates will be before the "null" string. However this won't work if null is represented by empty string. In that case you can use (with terrible indenting):

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)

if instead you wish to filter out the null values so that they don't even appear in the results, then a generator is the way to go:

sorted_date = sorted((item for item in data if item["date"] not in null_values),
                     key=lambda x: x["date"])
Cal
  • 631
  • 3
  • 11