Pythonowy sposób sprawdzenia, czy lista jest posortowana, czy nie

145

Czy istnieje pythonowy sposób sprawdzenia, czy lista jest już posortowana w ASClubDESC

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

coś takiego isttimestamps.isSorted()wraca Truelub False.

Chcę wprowadzić listę znaczników czasu dla niektórych wiadomości i sprawdzić, czy transakcje pojawiły się we właściwej kolejności.

anijhaw
źródło

Odpowiedzi:

212

W rzeczywistości nie udzielamy odpowiedzi, której szuka anijhaw. Oto jedna wkładka:

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

W przypadku Pythona 3:

all(l[i] <= l[i+1] for i in range(len(l)-1))
Wai Yip Tung
źródło
2
To miłe. Możesz chcieć zawinąć go w funkcję, aby móc przekazać keyfunkcję do użycia. key=lambda x, y: x < yto dobre ustawienie domyślne.
aaronasterling
3
Kombinacja kilku rozwiązań:def isSorted(x, key = lambda x: x): return all([key(x[i]) <= key(x[i + 1]) for i in xrange(len(x) - 1)])
eacousineau
2
@aaronasterling: operator.lepowinno być szybsze niż lambda
Marian
To nie działa dla mnie (python --version = 2.6.4) l = [1, 2, 3, 4, 1, 6, 7, 8, 7] all(l[i] <= l[i+1] for i in xrange(len(l)-1)) drukuj jako wynik:True
prodev_paris
1
Wygląda na to, że Python 3.x już nie ma xrange, po prostu użyj range. Otrzymuję, NameError: name 'xrange' is not definedkiedy uruchamiam ten kod. Przełączyłem go na zwykłe używanie rangezamiast xrangei to działa dobrze. Zobacz: stackoverflow.com/questions/15014310/…
Cale Sweeney
78

Po prostu użyłbym

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

chyba że jest to bardzo duża lista, w takim przypadku możesz chcieć utworzyć funkcję niestandardową.

jeśli zamierzasz go po prostu posortować, jeśli nie jest posortowany, zapomnij o sprawdzeniu i posortuj go.

lst.sort()

i nie myśl o tym za dużo.

jeśli chcesz mieć funkcję niestandardową, możesz zrobić coś takiego

def is_sorted(lst, key=lambda x: x):
    for i, el in enumerate(lst[1:]):
        if key(el) < key(lst[i]): # i is the index of the previous element
            return False
    return True

Będzie to O (n), jeśli lista jest już posortowana (i O (n) w forpętli!), Więc chyba że spodziewasz się, że nie będzie posortowana (i dość losowa) przez większość czasu, zrobiłbym to, ponownie, po prostu posortuj listę.

aaronasterling
źródło
10
Jeśli to właśnie zamierzasz zrobić, równie dobrze możesz po prostu powiedzieć: lst.sort () bez sprawdzania warunkowego ;-)
SapphireSun
5
to jest nlogn, istnieje wyraźnie szybszy sposób w O (n), używając prostej pętli for.
anijhaw
1
@SapphireSun. Tak powiedziałem;)
aaronasterling
@anijhaw, Zobacz aktualizację, którą wprowadziłem, kiedy zostawiałeś komentarz. sprawdzanie to O (n), a sortowanie to O (nlgn). czy lepiej jest ponieść koszt O (n), aby po prostu odwrócić się i dodać O (nlgn), czy po prostu wziąć koszt sortowania posortowanej listy, która jest (jak sądzę) O (n) dla sortowania czasu.
aaronasterling
@ Aaron: Sprawdź
edycję
44

Ta forma iteratora jest o 10–15% szybsza niż przy indeksowaniu liczb całkowitych:

# python2 only
if str is bytes:
    from itertools import izip as zip

def is_sorted(l):
    return all(a <= b for a, b in zip(l, l[1:]))
PaulMcG
źródło
Nie widzę znaczącej różnicy na mojej maszynie gist.github.com/735259 Zmodyfikowany wariant # 7 z odpowiedzi @Nathana Farringtona to 2x szybszy stackoverflow.com/questions/3755136/ ...
jfs
Będzie to działać tylko w przypadku kontenerów „indeksowalnych”, takich jak lista, w którym to przypadku zostaną utworzone dwie nowe listy z podziałem. Dla ogólnych iteratorów wolę rozwiązanie Alexandre'a .
Bas Swinckels
1
Elegancka odpowiedź, możesz użyć izipi islicez itertools, aby przyspieszyć.
Elmex80s,
@jfs: „Wariant nr 7 od Nathana Farringtona” jest błędny. po prostu nie robi tego, co powinien i dlatego jest szybszy. zobacz mój komentarz.
olivecoder
1
Możesz uprościć swoje rozwiązanie do zip (l, l [1:]), ponieważ zip zatrzymuje się po wyczerpaniu najkrótszego argumentu
Gelineau
20

Pięknym sposobem na zaimplementowanie tego jest użycie imapfunkcji z 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))

Ta implementacja jest szybka i działa na dowolnych iterowalnych.

Alexandre Vassalotti
źródło
4
Ładny, ale powolny! Spróbuj na is_sorted(iter([1,2,3,2,5,8]))lub równoważnym generatorze. Musisz użyć niezależnego iteratora tail, spróbuj itertools.tee.
Kos
Pamiętaj, że iter(x) is xdla iteratorów
Kos,
1
Ach, to nieprzyjemna niespodzianka! Naprawiłem to teraz. Dzięki!
Alexandre Vassalotti
3
Zauważ, że w Pythonie 3 itertools.imapzmieniono nazwę na [__builtins__.]map.
Nick T
10

Przeprowadziłem test porównawczy i sorted(lst, reverse=True) == lstbyłem najszybszy w przypadku długich list i all(l[i] >= l[i+1] for i in xrange(len(l)-1))najszybszy w przypadku krótkich list . Te testy porównawcze zostały uruchomione na 13-calowym MacBooku Pro 2010 (Core2 Duo 2,66 GHz, 4 GB 1067 MHz DDR3 RAM, Mac OS X 10.6.5).

AKTUALIZACJA: Poprawiłem skrypt, abyś mógł uruchomić go bezpośrednio w swoim własnym systemie. Poprzednia wersja zawierała błędy. Dodałem również posortowane i nieposortowane dane wejściowe.

  • Najlepsze dla krótkich posortowanych list: all(l[i] >= l[i+1] for i in xrange(len(l)-1))
  • Najlepsze dla długo posortowanych list: sorted(l, reverse=True) == l
  • Najlepsze do krótkich nieposortowanych list: all(l[i] >= l[i+1] for i in xrange(len(l)-1))
  • Najlepsze do długich nieposortowanych list: all(l[i] >= l[i+1] for i in xrange(len(l)-1))

Więc w większości przypadków jest wyraźny zwycięzca.

AKTUALIZACJA: odpowiedzi aaronsterlinga (# 6 i # 7) są w rzeczywistości najszybsze we wszystkich przypadkach. # 7 jest najszybszy, ponieważ nie ma warstwy pośredniej do wyszukiwania klucza.

#!/usr/bin/env python

import itertools
import time

def benchmark(f, *args):
    t1 = time.time()
    for i in xrange(1000000):
        f(*args)
    t2 = time.time()
    return t2-t1

L1 = range(4, 0, -1)
L2 = range(100, 0, -1)
L3 = range(0, 4)
L4 = range(0, 100)

# 1.
def isNonIncreasing(l, key=lambda x,y: x >= y): 
    return all(key(l[i],l[i+1]) for i in xrange(len(l)-1))
print benchmark(isNonIncreasing, L1) # 2.47253704071
print benchmark(isNonIncreasing, L2) # 34.5398209095
print benchmark(isNonIncreasing, L3) # 2.1916718483
print benchmark(isNonIncreasing, L4) # 2.19576501846

# 2.
def isNonIncreasing(l):
    return all(l[i] >= l[i+1] for i in xrange(len(l)-1))
print benchmark(isNonIncreasing, L1) # 1.86919999123
print benchmark(isNonIncreasing, L2) # 21.8603689671
print benchmark(isNonIncreasing, L3) # 1.95684289932
print benchmark(isNonIncreasing, L4) # 1.95272517204

# 3.
def isNonIncreasing(l, key=lambda x,y: x >= y): 
    return all(key(a,b) for (a,b) in itertools.izip(l[:-1],l[1:]))
print benchmark(isNonIncreasing, L1) # 2.65468883514
print benchmark(isNonIncreasing, L2) # 29.7504849434
print benchmark(isNonIncreasing, L3) # 2.78062295914
print benchmark(isNonIncreasing, L4) # 3.73436689377

# 4.
def isNonIncreasing(l):
    return all(a >= b for (a,b) in itertools.izip(l[:-1],l[1:]))
print benchmark(isNonIncreasing, L1) # 2.06947803497
print benchmark(isNonIncreasing, L2) # 15.6351969242
print benchmark(isNonIncreasing, L3) # 2.45671010017
print benchmark(isNonIncreasing, L4) # 3.48461818695

# 5.
def isNonIncreasing(l):
    return sorted(l, reverse=True) == l
print benchmark(isNonIncreasing, L1) # 2.01579380035
print benchmark(isNonIncreasing, L2) # 5.44593787193
print benchmark(isNonIncreasing, L3) # 2.01813793182
print benchmark(isNonIncreasing, L4) # 4.97615599632

# 6.
def isNonIncreasing(l, key=lambda x, y: x >= y): 
    for i, el in enumerate(l[1:]):
        if key(el, l[i-1]):
            return False
    return True
print benchmark(isNonIncreasing, L1) # 1.06842684746
print benchmark(isNonIncreasing, L2) # 1.67291283607
print benchmark(isNonIncreasing, L3) # 1.39491200447
print benchmark(isNonIncreasing, L4) # 1.80557894707

# 7.
def isNonIncreasing(l):
    for i, el in enumerate(l[1:]):
        if el >= l[i-1]:
            return False
    return True
print benchmark(isNonIncreasing, L1) # 0.883186101913
print benchmark(isNonIncreasing, L2) # 1.42852401733
print benchmark(isNonIncreasing, L3) # 1.09229516983
print benchmark(isNonIncreasing, L4) # 1.59502696991
Nathan Farrington
źródło
1
Twój punkt odniesienia testuje najgorszy przypadek dla form wyrażeń generatora i najlepszy przypadek dla mojego rozwiązania. Możesz również przeprowadzić test na niesortowanej liście. Wtedy zobaczysz, że jeśli nie oczekujesz, że lista będzie sortowana przez większość czasu, wyrażenie generatora jest lepsze.
aaronasterling
@aaronsterling, zaktualizowałem skrypt, aby zawierał zarówno posortowane, jak i nieposortowane dane wejściowe.
Nathan Farrington,
Wszystkie funkcje z enumeratesą nieprawidłowe. enumerate(l[1:])należy zastąpićenumerate(l[1:], 1)
jfs
1
zamiast zastąpienia enumerate(l[1:])przez enumerate(l[1:], 1)was mógłby zastąpić l[i-1]przez l[i].
jfs
Jeśli dodasz np. Losowe dane wejściowe, L5=range(100); random.shuffle(L5)numer 5 jest stosunkowo wolny. W tym przypadku zmodyfikowany numer 7 jest ogólnie szybszy codepad.org/xmWPxHQY
jfs
9

Zrobiłbym to (kradnąc z wielu odpowiedzi tutaj [Aaron Sterling, Wai Yip Tung, trochę od Paula McGuire'a] i głównie 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))

Jedna fajna rzecz: nie musisz zdawać sobie sprawy z drugiej iterowalnej dla serii (w przeciwieństwie do wycinka listy).

hughdbrown
źródło
2
myląca nazwa key. keynależy używać do zamiany pozycji na porównywalne wartości.
InQβ
4

Używam tej jednej linijki opartej na numpy.diff ():

def issorted(x):
    """Check if x is sorted"""
    return (numpy.diff(x) >= 0).all() # is diff between all consecutive entries >= 0?

Tak naprawdę nie porównałem tego z żadną inną metodą, ale zakładam, że jest szybsza niż jakakolwiek czysta metoda Pythona, szczególnie dla dużego n, ponieważ pętla w numpy.diff (prawdopodobnie) działa bezpośrednio w C (n-1 odejmowania, po których następuje n -1 porównania).

Musisz jednak być ostrożny, jeśli x jest liczbą int bez znaku, co może powodować cichy niedopełnienie liczby całkowitej w numpy.diff (), powodując fałszywie dodatni wynik. Oto zmodyfikowana wersja:

def issorted(x):
    """Check if x is sorted"""
    try:
        if x.dtype.kind == 'u':
            # x is unsigned int array, risk of int underflow in np.diff
            x = numpy.int64(x)
    except AttributeError:
        pass # no dtype, not an array
    return (numpy.diff(x) >= 0).all()
Martin Spacek
źródło
4

Jest to podobne do pierwszej odpowiedzi, ale podoba mi się bardziej, ponieważ pozwala uniknąć jawnego indeksowania. Zakładając, że Twoja lista ma nazwę lst, możesz generować
(item, next_item)krotki z listy za pomocą zip:

all(x <= y for x,y in zip(lst, lst[1:]))

W Pythonie 3 zipjuż zwraca generator, w Pythonie 2 możesz użyć itertools.izipdla lepszej wydajności pamięci.

Małe demo:

>>> lst = [1, 2, 3, 4]
>>> zip(lst, lst[1:])
[(1, 2), (2, 3), (3, 4)]
>>> all(x <= y for x,y in zip(lst, lst[1:]))
True
>>> 
>>> lst = [1, 2, 3, 2]
>>> zip(lst, lst[1:])
[(1, 2), (2, 3), (3, 2)]
>>> all(x <= y for x,y in zip(lst, lst[1:]))
False

Ostatnia nie powiedzie się podczas oceny krotki (3, 2).

Bonus: sprawdzanie skończonych (!) Generatorów, których nie można indeksować:

>>> def gen1():
...     yield 1
...     yield 2
...     yield 3
...     yield 4
...     
>>> def gen2():
...     yield 1
...     yield 2
...     yield 4
...     yield 3
... 
>>> g1_1 = gen1()
>>> g1_2 = gen1()
>>> next(g1_2)
1
>>> all(x <= y for x,y in zip(g1_1, g1_2))
True
>>>
>>> g2_1 = gen2()
>>> g2_2 = gen2()
>>> next(g2_2)
1
>>> all(x <= y for x,y in zip(g2_1, g2_2))
False

Upewnij się, że używasz itertools.iziptutaj, jeśli używasz Pythona 2, w przeciwnym razie pokonałbyś cel, jakim jest brak konieczności tworzenia list z generatorów.

timgeb
źródło
2
Możesz nawet użyć islicedo optymalizacji pod kątem krojenia. Również w module itertools. all(x <= y for x, y in izip(lst, islice(lst, 1))).
Elmex80s,
3

SapphireSun ma rację. Możesz po prostu użyć lst.sort(). Implementacja sortowania w Pythonie (TimSort) sprawdza, czy lista jest już posortowana. Jeśli tak, sort () zakończy się w czasie liniowym. Brzmi jak Pythonic, aby upewnić się, że lista jest posortowana;)

Wai Yip Tung
źródło
20
Tylko czas liniowy, jeśli lista jest faktycznie posortowana. Jeśli nie, nie ma zwarcia, aby pominąć faktyczne zadanie sortowania, więc jeśli lista jest długa, może być ogromna kara do zapłaty.
PaulMcG,
To świetna odpowiedź, jeśli Twoim zadaniem jest „upewnij się, że lista jest posortowana, a jeśli nie, umrzyj”. Co jest dość powszechne, gdy chodzi o kontrolę poprawności danych, które powinny być sortowane z innego powodu. Wtedy tylko przypadek błędu jest powolny.
Ed Avis
3

Chociaż nie wydaje mi się, aby istniała gwarancja, że sortedwbudowana funkcja wywoła swoją funkcję cmp za pomocą i+1, i, wydaje się, że robi to w przypadku CPythona.

Możesz więc zrobić coś takiego:

def my_cmp(x, y):
   cmpval = cmp(x, y)
   if cmpval < 0:
      raise ValueError
   return cmpval

def is_sorted(lst):
   try:
      sorted(lst, cmp=my_cmp)
      return True
   except ValueError:
      return False

print is_sorted([1,2,3,5,6,7])
print is_sorted([1,2,5,3,6,7])

Lub w ten sposób (bez instrukcji if -> EAFP poszło źle? ;-)):

def my_cmp(x, y):
   assert(x >= y)
   return -1

def is_sorted(lst):
   try:
      sorted(lst, cmp=my_cmp)
      return True
   except AssertionError:
      return False
Anthon
źródło
3

Niezbyt Pythonic, ale potrzebujemy przynajmniej jednej reduce()odpowiedzi, prawda?

def is_sorted(iterable):
    prev_or_inf = lambda prev, i: i if prev <= i else float('inf')
    return reduce(prev_or_inf, iterable, float('-inf')) < float('inf')

Zmienna akumulator po prostu przechowuje tę ostatnio sprawdzaną wartość, a jeśli jakakolwiek wartość jest mniejsza niż poprzednia wartość, akumulator jest ustawiany na nieskończoność (a zatem na końcu nadal będzie nieskończoność, ponieważ „poprzednia wartość” będzie zawsze większa niż obecna).

orlade
źródło
2

Jak zauważył @aaronsterling, poniższe rozwiązanie jest najkrótsze i wydaje się najszybsze, gdy tablica jest posortowana i niezbyt mała: def is_sorted (lst): return (sort (lst) == lst)

Jeśli przez większość czasu tablica nie jest posortowana, pożądane byłoby użycie rozwiązania, które nie skanuje całej tablicy i zwraca wartość False, gdy tylko zostanie znaleziony nieposortowany prefiks. Oto najszybsze rozwiązanie, jakie udało mi się znaleźć, nie jest szczególnie eleganckie:

def is_sorted(lst):
    it = iter(lst)
    try:
        prev = it.next()
    except StopIteration:
        return True
    for x in it:
        if prev > x:
            return False
        prev = x
    return True

Korzystając z testu porównawczego Nathana Farringtona, zapewnia to lepszy czas działania niż użycie sortowanego (lst) we wszystkich przypadkach, z wyjątkiem uruchamiania na dużej posortowanej liście.

Oto wyniki testów wydajności na moim komputerze.

sortowane (lst) == lst rozwiązanie

  • L1: 1,23838591576
  • L2: 4,19063091278
  • L3: 1.17996287346
  • L4: 4,68399500847

Drugie rozwiązanie:

  • L1: 0,81095790863
  • L2: 0,802397012711
  • L3: 1,06135106087
  • L4: 8.82761001587
Amit Moscovich
źródło
2

Jeśli chcesz najszybszego sposobu na tablice numpy, użyj numba , który, jeśli używasz conda, powinien być już zainstalowany

Kod będzie szybki, ponieważ zostanie skompilowany przez numba

import numba
@numba.jit
def issorted(vec, ascending=True):
    if len(vec) < 2:
        return True
    if ascending:
        for i in range(1, len(vec)):
            if vec[i-1] > vec[i]:
                return False
        return True
    else:
        for i in range(1, len(vec)):
            if vec[i-1] < vec[i]:
                return False
        return True

i wtedy:

>>> issorted(array([4,9,100]))
>>> True
tal
źródło
2

Wystarczy dodać inny sposób (nawet jeśli wymaga to dodatkowego modułu) iteration_utilities.all_monotone:

>>> from iteration_utilities import all_monotone
>>> listtimestamps = [1, 2, 3, 5, 6, 7]
>>> all_monotone(listtimestamps)
True

>>> all_monotone([1,2,1])
False

Aby sprawdzić zamówienie DESC:

>>> all_monotone(listtimestamps, decreasing=True)
False

>>> all_monotone([3,2,1], decreasing=True)
True

Istnieje również strictparametr, jeśli trzeba sprawdzić ściśle (czy kolejne elementy nie powinny być równe) ciągów monotonicznych.

W twoim przypadku nie stanowi to problemu, ale jeśli twoje sekwencje zawierają nanwartości, niektóre metody zawiodą, na przykład posortowane:

def is_sorted_using_sorted(iterable):
    return sorted(iterable) == iterable

>>> is_sorted_using_sorted([3, float('nan'), 1])  # definetly False, right?
True

>>> all_monotone([3, float('nan'), 1])
False

Zauważ, że iteration_utilities.all_monotonedziała szybciej w porównaniu z innymi wymienionymi tutaj rozwiązaniami, szczególnie w przypadku niesortowanych danych wejściowych (patrz test porównawczy ).

MSeifert
źródło
2

Leniwy

from itertools import tee

def is_sorted(l):
    l1, l2 = tee(l)
    next(l2, None)
    return all(a <= b for a, b in zip(l1, l2))
Sergey11g
źródło
1
Absolutnie niesamowite! Oto moje ulepszenie, aby uczynić go jednowierszowym - zamiast iter () i next () użyj cięcia z tym samym wynikiem:all(a <= b for a, b in zip(l, l[1:]))
Matt
1
@LiborJelinek dobrze, ale moja wersja działa, gdy ljest generatorem i nie obsługuje krojenia.
Sergey11g
2

Python 3.6.8

from more_itertools import pairwise

class AssertionHelper:
    @classmethod
    def is_ascending(cls, data: iter) -> bool:
        for a, b in pairwise(data):
            if a > b:
                return False
        return True

    @classmethod
    def is_descending(cls, data: iter) -> bool:
        for a, b in pairwise(data):
            if a < b:
                return False
        return True

    @classmethod
    def is_sorted(cls, data: iter) -> bool:
        return cls.is_ascending(data) or cls.is_descending(data)
>>> AssertionHelper.is_descending((1, 2, 3, 4))
False
>>> AssertionHelper.is_ascending((1, 2, 3, 4))
True
>>> AssertionHelper.is_sorted((1, 2, 3, 4))
True
Chweng Mega
źródło
0

Najprostszy sposób:

def isSorted(arr):
  i = 1
  while i < len(arr):
    if(result[i] < result[i - 1]):
      return False
    i += 1
  return True
Aluis92
źródło
0
from functools import reduce

# myiterable can be of any iterable type (including list)
isSorted = reduce(lambda r, e: (r[0] and (r[1] or r[2] <= e), False, e), myiterable, (True, True, None))[0]

Wyprowadzona wartość redukcji jest 3-częściową krotką ( sortSoFarFlag , firstTimeFlag , lastElementValue ). Początkowo zaczyna się ( True, True, None), który jest również stosowany jako wynik dla pustej listy (traktowane jako sortowane, bo nie ma out-of-order elementy). Gdy przetwarza każdy element, oblicza nowe wartości krotki (używając poprzednich wartości krotki z następnym elementem elementValue):

[0] (sortedSoFarFlag) evaluates true if: prev_0 is true and (prev_1 is true or prev_2 <= elementValue)
[1] (firstTimeFlag): False
[2] (lastElementValue): elementValue

Ostatecznym wynikiem redukcji jest krotka:

[0]: True/False depending on whether the entire list was in sorted order
[1]: True/False depending on whether the list was empty
[2]: the last element value

Pierwsza wartość to ta, która nas interesuje, więc używamy jej [0]do wyłapania jej z wyniku redukcji.

Panie Weasel
źródło
Zwróć uwagę, że to rozwiązanie działa dla wszystkich iterowalnych typów elementów, które można ze sobą porównać. Obejmuje to listy wartości logicznych (sprawdza, czy wartości Fałsz występują przed wartościami True), listy liczb, listy ciągów (kolejność alfabetyczna), listy zestawów (podzbiory występują przed superzestawami) itp.
Mr Weasel
0

Ponieważ nie widzę tej opcji powyżej, dodam ją do wszystkich odpowiedzi. Oznaczmy więc listę następująco l:

import numpy as np

# Trasform the list to a numpy array
x = np.array(l)

# check if ascendent sorted:
all(x[:-1] <= x[1:])

# check if descendent sorted:
all(x[:-1] >= x[1:])
FBruzzesi
źródło
0

Rozwiązanie wykorzystujące wyrażenia przypisania (dodane w Pythonie 3.8):

def is_sorted(seq):
    seq_iter = iter(seq)
    cur = next(seq_iter, None)
    return all((prev := cur) <= (cur := nxt) for nxt in seq_iter)

z = list(range(10))
print(z)
print(is_sorted(z))

import random
random.shuffle(z)
print(z)
print(is_sorted(z))

z = []
print(z)
print(is_sorted(z))

Daje:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
True
[1, 7, 5, 9, 4, 0, 8, 3, 2, 6]
False
[]
True
PaulMcG
źródło
-1

W rzeczywistości jest to najkrótszy sposób na zrobienie tego za pomocą rekurencji:

jeśli to Posortowane, wyświetli True, w przeciwnym razie wydrukuje False

 def is_Sorted(lst):
    if len(lst) == 1:
       return True
    return lst[0] <= lst[1] and is_Sorted(lst[1:])

 any_list = [1,2,3,4]
 print is_Sorted(any_list)
Baraa
źródło
Pamiętaj, że spowoduje to wzrost w RuntimeError: maximum recursion depth exceededprzypadku długich list. Spróbuj any_list = range(1000).
timgeb
-1

A co z tym? Proste i zrozumiałe.

def is_list_sorted(al):

    llength =len(al)


    for i in range (llength):
        if (al[i-1] > al[i]):
            print(al[i])
            print(al[i+1])
            print('Not sorted')
            return -1

    else :
        print('sorted')
        return  true
Zuckerberg
źródło
-3

Zdecydowanie działa w Pythonie 3 i nowszych wersjach dla liczb całkowitych lub ciągów:

def tail(t):
    return t[:]

letters = ['a', 'b', 'c', 'd', 'e']
rest = tail(letters)
rest.sort()
if letters == rest:
    print ('Given list is SORTED.')
else:
    print ('List NOT Sorted.')

==================================================== ===================

Inny sposób sprawdzenia, czy dana lista jest posortowana, czy nie

trees1 = list ([1, 4, 5, 3, 2])
trees2 = list (trees1)
trees2.sort()
if trees1 == trees2:
    print ('trees1 is SORTED')
else:
    print ('Not sorted')
cooldeal
źródło