2 votes

Triage de la liste des dictionnaires imbriqués par valeur à l'intérieur d'une liste

[OrderedDict([('id', 1), ('events', [OrderedDict([('id', 4), ('timestamp', '2018-01-19T15:47:56.587126Z')]),
                                     OrderedDict([('id', 5), ('timestamp', '2018-01-19T15:47:56.587761Z')])])]),
 OrderedDict([('id', 2), ('events', [OrderedDict([('id', 6), ('timestamp', '2018-01-19T15:47:56.588413Z')])])])]

Je essaie de trier en utilisant

sorted(my_list, key=lambda e: e['events'][0]['timestamp'], reverse=True)

mais cela ne fonctionne que lorsque la liste sous 'events' a une longueur de un. Si je mets reverse=False, j'obtiens le tri correct (juste à l'envers) mais j'ai besoin du tri par horodatage le plus récent

Modifier:

Le tri que j'essaie d'obtenir aurait les horodatages dans cet ordre:

('timestamp', '2018-01-19T15:47:56.588413Z')
('timestamp', '2018-01-19T15:47:56.587761Z')
('timestamp', '2018-01-19T15:47:56.587126Z')

1voto

pylang Points 12013

Il semble que vous souhaitiez inverser la liste des OrderedDicts ainsi que les listes imbriquées. Nous pouvons le faire en recréant la liste à l'envers.

Code

def reversed_nested_list(lst):
    """Retourne une liste inversée des OrderedDicts imbriqués peu profonds."""
    main_lst = []
    for od in lst[::-1]:
        replaced = ct.OrderedDict()
        for k, v in od.items():
            if not isinstance(v, list):
                replaced[k] = v
            else:
                replaced[k] = v[::-1]
        main_lst.append(replaced)
    return main_lst

reversed_nested_list(my_list)

Output

[OrderedDict([('id', 2),
              ('events',
               [OrderedDict([('id', 6),
                             ('timestamp',
                              '2018-01-19T15:47:56.588413Z')])])]),
 OrderedDict([('id', 1),
              ('events',
               [OrderedDict([('id', 5),
                             ('timestamp', '2018-01-19T15:47:56.587761Z')]),
                OrderedDict([('id', 4),
                             ('timestamp',
                              '2018-01-19T15:47:56.587126Z')])])])]

Étant donné que vos événements ont déjà été insérés dans l'ordre temporel, nous pouvons simplement itérer la liste principale et réassigner toutes les listes imbriquées dans l'ordre inverse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X