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']
4 Réponses :
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
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
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
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
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('')
Ou, encore plus rapide pour la dernière partie: ['not found'] * row.count ('not found') + [''] * row.count ('')
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)
Vous avez clairement énoncé le problème de base: l'ordre que vous voulez n'est pas ce que
sortprend en charge, mais vous vous attendez d'une certaine manière à ce quesortfasse 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)