205 votes

Pythonic façon de vérifier si une liste est triée ou non

Est-il un pythonic façon de vérifier si une liste est déjà triée dans AESC ou DESC.

listtimestamps=[1,2,3,5,6,7]

quelque chose comme listtimestamps.isSorted() qui renvoie True ou False.

EDIT: je tiens à l'entrée d'une liste des horodateurs pour certains messages et vérifier si les opérations paru dans le bon ordre.

et je peux écrire une fonction personnalisée trop :) , Merci

EDIT: Merci de remarquer chameau cas de questions :)

EDIT: je suis désolé si je n'ai pas été clair, je n'ai pas besoin de faire le tri par la suite, j'ai juste besoin de vérifier si la liste est triée, je l'utilise pour résoudre un problème de décision

289voto

Wai Yip Tung Points 5013

En fait nous ne sommes pas donner la réponse anijhaw est à la recherche pour. Ici est le seul liner:

all(l[i] <= l[i+1] for i in xrange(len(l)-1))

123voto

aaronasterling Points 25749

Je voudrais juste utiliser

if sorted(lst) == lst:
    # code here

sauf si c'est un très grand liste dans ce cas, vous souhaiterez peut-être créer une fonction personnalisée.

si vous avez l'intention de faire le tri, si ce n'est pas trié, alors oubliez les vérifier et de les trier.

lst.sort()

et ne pensez pas trop.

si vous voulez une fonction personnalisée, vous pouvez faire quelque chose comme

def is_sorted(lst, key=lambda x, y: x < y):
    for i, el in enumerate(lst[1:]):
        if key(el, lst[i-1]):
            return False
    return True

Ce sera en O(n) si la liste est déjà triée bien (et O(n) en for boucle qui plus est!) donc, à moins que vous l'attendez pas trié (et assez aléatoire), la plupart du temps, je voudrais, une fois encore, de trier la liste.

57voto

Paul McGuire Points 24790

Cet itérateur forme est de 10 à 15% plus rapide que l'utilisation d'entiers indexation:

from itertools import izip
isSorted = lambda l : all(a <= b for a,b in izip(l[:-1],l[1:]))

24voto

Une belle façon de mettre en œuvre consiste à utiliser l' imap fonction à partir d' itertools:

from itertools import imap, tee
import operator

def is_sorted(iterable, compare=operator.le):
  a, b = tee(iterable)
  next(b, None)
  return all(imap(compare, a, b))

Cette mise en œuvre est rapide et fonctionne sur n'importe quel iterables.

10voto

hughdbrown Points 15770

Je le ferais (le vol d'un lot de réponses ici [Aaron Sterling, Yip Wai Tung, sorta de Paul McGuire] et surtout Armin Ronacher):

from itertools import tee, izip

def pairwise(iterable):
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

def is_sorted(iterable, key=lambda a, b: a <= b):
    return all(key(a, b) for a, b in pairwise(iterable))

Une bonne chose: vous n'avez pas à réaliser la deuxième itératif pour la série (contrairement à une liste de tranche).

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