1
votes

Python: Triez la liste des listes par taille (inversée) et stockez les index d'origine

essentiellement une combinaison de ceci:

[x[0] for x in sorted(MYLIST, key=len, reverse=True)]
[x[0] for x in sorted(MYLIST, key=lambda i: i[1])]


1 commentaires

veuillez fournir un exemple de code


3 Réponses :


0
votes

Si nous disons que lst_of_lst est la liste d'origine,

sorted_lst = [(len(lst), lst) for lst in lst_of_lst]
sorted_lst = sorted(sorted_lst, reverse = True)
sorted_lst = [lst for (length,lst) in sorted_lst]

sorted_lst est la nouvelle liste triée.

Toutefois, ce code peut ne pas fonctionner selon la façon dont vous souhaitez traiter les cas où deux listes ont la même longueur.


0 commentaires

0
votes

Étant donné que sorted et enumerate sont des itérateurs, il n'est pas vraiment possible d'obtenir l'effet souhaité en les utilisant ensemble dans une seule boucle. Donc, à la place, nous recueillons les informations que vous voulez séparément.

old index: 0 new_index: 0
[1, 2, 3, 4, 5]

old index: 3 new_index: 1
[1, 2, 3, 4]

old index: 2 new_index: 2
[1, 2, 3]

old index: 1 new_index: 3
[1, 2]

La sortie serait dans l'ordre inverse de la longueur (du plus grand au plus petit) en imprimant l'ancien et le nouveau index comme ceci:

nested_lists = [
    [1, 2, 3, 4, 5],
    [1, 2],
    [1, 2, 3],
    [1, 2, 3, 4]
]

# Capture original indices
indexed_lists = [(index, sublist) for index, sublist in enumerate(nested_lists)]

# sort them by length of sublist
sorted_lists = sorted(indexed_lists, reverse=True, key=lambda item: len(item[1]))

# Iterate over the sorted object, printing the old and new indexes
for new_index, (old_index, sublist) in enumerate(sorted_lists):
    print('old index:', old_index, 'new_index:', new_index)
    print(sublist, end='\n\n')


0 commentaires

0
votes

Vous pouvez utiliser sorted avec enumerate et fournir à la méthode la key et les paramètres reverse . Ci-dessous, lst est trié par longueur, puis inversé.

Par exemple, si vous avez une liste comme celle-ci:

[(1, [34, 34, 76, 23, 65]), (0, [29, 53, 27]), (2, [32, 39])]

Vous pouvez utiliser sorted et enumerate dans une seule ligne:

sorted_lst = sorted(enumerate(lst), key=lambda v: len(v[1]), reverse=True)

Qui renvoie une liste de tuples avec la position d'index d'origine comme première valeur et la liste comme deuxième valeur:

lst = [[29,53,27], [34,34,76,23,65], [32,39]]


0 commentaires