0
votes

PYTHON Trier la liste avec des valeurs vides, chaîne et numérique

Je veux trier la liste courte comme:

row.sort(key=lambda x: str(x).isnumeric() and not bool(x))

à

# numeric values first, 'not found' less prioritize and '' in the end
['555', 'not found', ''] 

J'essaie d'utiliser

# we can have only 3 types of value: any string numeric value like '555', 'not found' and '' (can have any variation with these options)
row = ['not found', '', '555']


2 commentaires

Vous avez clairement énoncé le problème de base: l'ordre que vous voulez n'est pas ce que sort prend en charge, mais vous vous attendez d'une certaine manière à ce que sort fasse ce que vous voulez. Vous devez définir votre propre fonction clé pour produire les priorités telles que vous les définissez. Vous pouvez également filtrer la liste dans les trois regroupements que vous spécifiez, trier chaque regroupement et concaténer les résultats.


J'ai ajouté une solution avec une fonction pour le tri (key = func)


4 Réponses :


1
votes
def custom_sort(list):
    L1 = []
    L2 = []
    L3 = []
    for element in list:
        if element.isnumeric():
            L1.append(element)
        if element == 'Not found':
            L2.append(element)
        else : L3.append(element)
    L1.sort()
    L1.append(L2).append(L3)
    return L1

2 commentaires

Vous ne pouvez pas faire L1.append (L2) .append (L3) . Quoi qu'il en soit, je pense que ce que vous essayez de faire ici est L1.extend (L2); L1.extend (L3) .


En fait, je n'ai pas essayé ça. J'ai répondu à cela depuis mon smartphone. Mais merci mec



1
votes

Edit: Tri des valeurs non numériques par ask

ar = [i for i in row if not i.isnumeric()]
ar.sort(reverse=True)
row = [i for i in row if i.isnumeric()] + ar


2 commentaires

Cette solution ne prend pas en compte le fait que 'not found' devrait surclasser '' dans la liste triée.


@AdamBoinet à droite. J'ai ajouté cela en commentaire dans l'un des commentaires



0
votes

Cela triera votre liste et donnera à 'introuvable' une priorité plus élevée que '':

l = [int(a) for a in row if a.isnumeric()] # Or float(a)
l.sort()
row = [str(a) for a in l] +\
    ['not found'] * row.count('not found') +\
    [''] * row.count('')


1 commentaires

Ou, encore plus rapide pour la dernière partie: ['not found'] * row.count ('not found') + [''] * row.count ('')



0
votes

Cela fera également l'affaire:

['not found', '', 555, 1, '5', 444]
[1, '5', 444, 555, 'not found', '']

Résultats:

row = ['not found', '', 555, 1, '5' , 444]
print(row)

def func(x):
    if str(x).isnumeric():
        return  1/-int(x) # ordering numerics event if they are strings 
    elif str(x) == 'not found':
        return  2
    elif str(x) == '':
        return  3

row2 = row.sort(key=func)

print(row)


0 commentaires