pythonsortinglexicographic-ordering

Sort lines in txt based on double condition


I have a large txt file whose structure looks like :


I was wondering if there is a way to a) regroup and sort all lines that have the same title_topic and b) sort them afterwards based on logical number order (1,2..9,10,11, 12 etc.).

Thank you all in advance.

Example of txt file :

{"title_topic": "Résoudre un problème avec Go voyage", "title_foreach_post": ["\nRe: Résoudre un problème avec Go voyage "], "post_number": "null"}

{"title_topic": "Résoudre un problème avec Go voyage", "title_foreach_post": ["\nRe: Résoudre un problème avec Go voyage "], "post_number": "1."}

{"title_topic": "Résoudre un problème avec Go voyage", "title_foreach_post": ["\nRe: Résoudre un problème avec Go voyage "], "post_number": "10."}

{"title_topic": "Loueur Goldcar ne rembourse pas une réservation annulée", "title_foreach_post": ["\nRe: Loueur Goldcar ne rembourse pas une réservation annulée "], "post_number": "null"}

{"title_topic": "Loueur Goldcar ne rembourse pas une réservation annulée", "title_foreach_post": ["\nRe: Loueur Goldcar ne rembourse pas une réservation annulée "], "post_number": "1."}

{"title_topic": "Loueur Goldcar ne rembourse pas une réservation annulée", "title_foreach_post": ["\nRe: Loueur Goldcar ne rembourse pas une réservation annulée "], "post_number": "12."}

{"title_topic": "Résoudre un problème avec Go voyage", "title_foreach_post": ["\nRe: Résoudre un problème avec Go voyage "], "post_number": "11."}

{"title_topic": "Résoudre un problème avec Go voyage", "title_foreach_post": ["\nRe: Résoudre un problème avec Go voyage "], "post_number": "12."}

Output example:

Output example


Solution

  • As you can see in code below I use sorted() built-in function to sort list of entries by two fields (e['title_topic'], e['post_number']).

    Just for example I'm reading input file from text string using io.StringIO() to model file input, in real life you'll use regular file reading.

    Try it online!

    import io, json
    
    text = r"""
    {"title_topic": "Résoudre un problème avec Go voyage", "title_foreach_post": ["\nRe: Résoudre un problème avec Go voyage "], "post_number": "null"}
    {"title_topic": "Résoudre un problème avec Go voyage", "title_foreach_post": ["\nRe: Résoudre un problème avec Go voyage "], "post_number": "1."}
    {"title_topic": "Résoudre un problème avec Go voyage", "title_foreach_post": ["\nRe: Résoudre un problème avec Go voyage "], "post_number": "10."}
    {"title_topic": "Loueur Goldcar ne rembourse pas une réservation annulée", "title_foreach_post": ["\nRe: Loueur Goldcar ne rembourse pas une réservation annulée "], "post_number": "null"}
    {"title_topic": "Loueur Goldcar ne rembourse pas une réservation annulée", "title_foreach_post": ["\nRe: Loueur Goldcar ne rembourse pas une réservation annulée "], "post_number": "1."}
    {"title_topic": "Loueur Goldcar ne rembourse pas une réservation annulée", "title_foreach_post": ["\nRe: Loueur Goldcar ne rembourse pas une réservation annulée "], "post_number": "12."}
    {"title_topic": "Résoudre un problème avec Go voyage", "title_foreach_post": ["\nRe: Résoudre un problème avec Go voyage "], "post_number": "11."}
    {"title_topic": "Résoudre un problème avec Go voyage", "title_foreach_post": ["\nRe: Résoudre un problème avec Go voyage "], "post_number": "12."}
    """
    
    data = [json.loads(line) for line in io.StringIO(text) if line.strip()]
    data = sorted(data, key = lambda e: (e['title_topic'],
        int(float(e['post_number'])) if e['post_number'] != 'null' else 0))
    print(data)
    

    Output:

    [
        {
            "title_topic": "Loueur Goldcar ne rembourse pas une réservation annulée",
            "title_foreach_post": [
                "\nRe: Loueur Goldcar ne rembourse pas une réservation annulée "
            ],
            "post_number": "null"
        },
        {
            "title_topic": "Loueur Goldcar ne rembourse pas une réservation annulée",
            "title_foreach_post": [
                "\nRe: Loueur Goldcar ne rembourse pas une réservation annulée "
            ],
            "post_number": "1."
        },
        {
            "title_topic": "Loueur Goldcar ne rembourse pas une réservation annulée",
            "title_foreach_post": [
                "\nRe: Loueur Goldcar ne rembourse pas une réservation annulée "
            ],
            "post_number": "12."
        },
        {
            "title_topic": "Résoudre un problème avec Go voyage",
            "title_foreach_post": [
                "\nRe: Résoudre un problème avec Go voyage "
            ],
            "post_number": "null"
        },
        {
            "title_topic": "Résoudre un problème avec Go voyage",
            "title_foreach_post": [
                "\nRe: Résoudre un problème avec Go voyage "
            ],
            "post_number": "1."
        },
        {
            "title_topic": "Résoudre un problème avec Go voyage",
            "title_foreach_post": [
                "\nRe: Résoudre un problème avec Go voyage "
            ],
            "post_number": "10."
        },
        {
            "title_topic": "Résoudre un problème avec Go voyage",
            "title_foreach_post": [
                "\nRe: Résoudre un problème avec Go voyage "
            ],
            "post_number": "11."
        },
        {
            "title_topic": "Résoudre un problème avec Go voyage",
            "title_foreach_post": [
                "\nRe: Résoudre un problème avec Go voyage "
            ],
            "post_number": "12."
        }
    ]