Sortowanie w Pythonie

Najłatwiejszym sposobem sortowania jest użycie funkcji sortowanego(lista), która pobiera listę i zwraca nową listę z posortowanymi elementami w takiej kolejności. Pierwotna lista nie uległa zmianie.

  a = [5, 1, 4, 3]
  print(sorted(a))  ## [1, 3, 4, 5]
  print(a)  ## [5, 1, 4, 3]

Lista jest najczęściej przekazywana do funkcji sort(), ale w rzeczywistości może przyjmować jako dane wejściowe dowolny rodzaj iteracyjnej kolekcji. Starsza metoda list.sort() jest alternatywną metodą opisaną poniżej. Funkcja sort() wydaje się prostsza w użyciu niż funkcja sort(), dlatego zalecamy korzystanie z tej funkcji.

Funkcję sort() można dostosować za pomocą opcjonalnych argumentów. Opcjonalny argument sort() przywrócony=True, np. sortowana(lista, odwrotna=True) sprawia, że dane są sortowane do tyłu.

  strs = ['aa', 'BB', 'zz', 'CC']
  print(sorted(strs))  ## ['BB', 'CC', 'aa', 'zz'] (case sensitive)
  print(sorted(strs, reverse=True))   ## ['zz', 'aa', 'CC', 'BB']

Sortowanie niestandardowe z kluczem=

W przypadku bardziej złożonego sortowania niestandardowego funkcja sort() przyjmuje opcjonalny „key=” określenie „klucza” która przekształca każdy element przed porównaniem. Funkcja klucza przyjmuje 1 wartość i zwraca 1 wartość, a zwrócona wartość „proxy” jest używana do porównań w ramach tego sortowania.

Na przykład w przypadku listy ciągów określenie klucz=len (wbudowana funkcja len()) sortuje ciągi według długości, od najkrótszego do najdłuższego. Sortowanie wywołuje funkcję len() dla każdego ciągu, aby otrzymać listę wartości długości serwera proxy, a następnie sortuje dane według tych wartości proxy.

  strs = ['ccc', 'aaaa', 'd', 'bb']
  print(sorted(strs, key=len))  ## ['d', 'bb', 'ccc', 'aaaa']

połączenie posortowane z wartością key=len

Kolejny przykład z podaniem parametru „str.lower” , ponieważ funkcja klucza to sposób wymuszenia sortowania tak samo, aby wielkie i małe litery były traktowane jednakowo:

  ## "key" argument specifying str.lower function to use for sorting
  print(sorted(strs, key=str.lower))  ## ['aa', 'BB', 'CC', 'zz']

Możesz również przekazać własną funkcję MyFn jako funkcję kluczową, na przykład:

  ## Say we have a list of strings we want to sort by the last letter of the string.
  strs = ['xc', 'zb', 'yd' ,'wa']

  ## Write a little function that takes a string, and returns its last letter.
  ## This will be the key function (takes in 1 value, returns 1 value).
  def MyFn(s):
    return s[-1]

  ## Now pass key=MyFn to sorted() to sort by the last letter:
  print(sorted(strs, key=MyFn))  ## ['wa', 'zb', 'xc', 'yd']

Jeśli chcesz użyć bardziej złożonego sortowania, np. sortowania według nazwiska, a potem według imienia, możesz użyć funkcji itemgetter lub attrgetter takich jak:

  from operator import itemgetter

  # (first name, last name, score) tuples
  grade = [('Freddy', 'Frank', 3), ('Anil', 'Frank', 100), ('Anil', 'Wang', 24)]
  sorted(grade, key=itemgetter(1,0))
  # [('Anil', 'Frank', 100), ('Freddy', 'Frank', 3), ('Anil', 'Wang', 24)]

  sorted(grade, key=itemgetter(0,-1))
  #[('Anil', 'Wang', 24), ('Anil', 'Frank', 100), ('Freddy', 'Frank', 3)]

metoda sortowania()

Zamiast metody sort() funkcja sort() na liście sortuje listę w kolejności rosnącej, np. list.sort(). Metoda sort() zmienia podstawową listę i zwraca wartość None, więc użyj jej w następujący sposób:

  alist.sort()            ## correct
  alist = blist.sort()    ## Incorrect. sort() returns None

To częsty błąd w przypadku funkcji sortowania, która *nie zwraca* posortowanej listy. Metoda sort() musi być wywoływana dla listy; nie działa w żadnym zbiorze wyliczanym (ale powyższa funkcja sort() działa na wszelkich kolekcjach). Metoda sort() jest starsza niż funkcja sort(), więc prawdopodobnie będzie widoczna w starszym kodzie. Metoda sort() nie musi tworzyć nowej listy, więc może działać trochę szybciej, jeśli elementy do sortowania znajdują się już na liście.

Kropki

Krótka to grupa elementów o stałym rozmiarze, np. współrzędne (x i y). Kropki przypominają listy, tyle że nie można ich zmienić i nie zmieniają rozmiaru (tule nie są stałe, ponieważ jeden z zawartych w nich elementów może być zmienny). Kropki odgrywają swego rodzaju „strukturę” w Pythonie, ponieważ jest to wygodny sposób na przekazanie pewnego logicznego pakietu wartości o stałym rozmiarze. Funkcja, która musi zwrócić wiele wartości, może zwrócić po prostu krotkę tych wartości. Jeśli na przykład chcesz uzyskać listę współrzędnych 3D, naturalną reprezentacją Pytona byłaby lista krotek, gdzie każda krotka ma rozmiar 3 i zawiera jedną grupę (x, y, z).

Aby utworzyć krotkę, wymień wartości w nawiasach rozdzielone przecinkami. „Puste” jest po prostu pustą parą nawiasów. Uzyskiwanie dostępu do elementów w krotce przypomina listę – len(), [ ], for, in itd. działają tak samo.

  tuple = (1, 2, 'hi')
  print(len(tuple))  ## 3
  print(tuple[2])    ## hi
  tuple[2] = 'bye'  ## NO, tuples cannot be changed
  tuple = (1, 2, 'bye')  ## this works

Aby utworzyć krotkę w rozmiarze 1, po ostatnim elemencie musi znajdować się przecinek.

  tuple = ('hi',)   ## size-1 tuple

To zabawny przypadek w składni, ale przecinek jest niezbędny do odróżnienia krotki od zwykłego przypadku polegającego na umieszczaniu wyrażenia w nawiasach. W niektórych przypadkach możesz pominąć nawias, a Python zobaczy od przecinków, że to krotka, która ma być krotką.

Przypisanie krotki do krotki o identycznym rozmiarze nazw zmiennych powoduje przypisanie wszystkich odpowiadających im wartości. Jeśli krotki nie mają tego samego rozmiaru, wystąpi błąd. Ta funkcja działa też w przypadku list.

  (x, y, z) = (42, 13, "hike")
  print(z)  ## hike
  (err_string, err_code) = Foo()  ## Foo() returns a length-2 tuple

Wyświetl listę objaśnień (opcjonalnie)

Zrozumienie list to bardziej zaawansowana funkcja, która jest przydatna w niektórych przypadkach, ale nie jest potrzebna w ćwiczeniach i nie wymaga nauki na początku (tj. możesz pominąć tę sekcję). Zrozumienie listy to kompaktowy sposób zapisu wyrażenia, które rozwija się do całej listy. Załóżmy, że mamy numery listy [1, 2, 3, 4]. Oto sposób interpretacji listy w celu obliczenia listy ich kwadratów [1, 4, 9, 16]:

  nums = [1, 2, 3, 4]

  squares = [ n * n for n in nums ]   ## [1, 4, 9, 16]

Składnia to [ expr for var in list ]for var in list wygląda jak zwykła pętla for, ale bez dwukropka (:). Wyrażenie expr po lewej stronie jest oceniane raz dla każdego elementu, aby podać wartości dla nowej listy. Oto przykład ciągów tekstowych, w których każdy ciąg jest pisany wielkimi literami za pomocą znaku „!!!”. dołączone:

  strs = ['hello', 'and', 'goodbye']

  shouting = [ s.upper() + '!!!' for s in strs ]
  ## ['HELLO!!!', 'AND!!!', 'GOODBYE!!!']

Możesz dodać test typu if po prawej stronie pętli for, by zawęzić wynik. Wynik testu „if” jest oceniany dla każdego elementu, w tym tylko tych, w których test jest prawdziwy.

  ## Select values <= 2
  nums = [2, 8, 1, 6]
  small = [ n for n in nums if n <= 2 ]  ## [2, 1]

  ## Select fruits containing 'a', change to upper case
  fruits = ['apple', 'cherry', 'banana', 'lemon']
  afruits = [ s.upper() for s in fruits if 'a' in s ]
  ## ['APPLE', 'BANANA']

Ćwiczenie: list1.py

Aby przećwiczyć materiał zawarty w tej sekcji, wypróbuj późniejsze zadania z list1.py, które korzystają z sortowania i krotek (w Ćwiczeniach podstawowych).