Python Sıralama

Sıralamanın en kolay yolu, bir listeyi alan ve bu öğeleri sıralı düzende içeren yeni bir liste döndüren sıralanmış(list) işlevidir. Orijinal liste değişmez.

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

Bir listenin Sort() işlevine geçirilmesi en yaygınıdır, ancak aslında herhangi bir tür tekrarlanabilir koleksiyonda girdi olarak alınabilir. Eski list.sort() yöntemi, aşağıda ayrıntılı olarak açıklanan bir alternatiftir. Sort() işlevini kullanmak, Sort() ile karşılaştırıldığında daha kolay göründüğü için Sort() kullanmanızı öneririz.

Sort() işlevi, isteğe bağlı bağımsız değişkenlerle özelleştirilebilir. Sort() isteğe bağlı bağımsız değişkeni ters=Doğru; ör. Sort(list, Uygulamanızın ters=Doğru) geriye doğru sıralanmasını sağlar.

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

Anahtar= ile Özel Sıralama

Daha karmaşık özel sıralama için Sort(), karşılaştırmadan önce her öğeyi dönüştüren bir "key" işlevi belirten isteğe bağlı "key=" işlevini kullanır. Anahtar işlevi 1 değeri alıp 1 değeri döndürür. Döndürülen "proxy" değeri ise sıralamadaki karşılaştırmalar için kullanılır.

Örneğin, bir dize listesinde key=len (yerleşik len() işlevi) belirtilmesi, dizeleri uzunluklarına göre en kısadan en uzuna doğru sıralar. Sıralama işlemi, proxy uzunluk değerlerinin listesini almak amacıyla her bir dize için len() çağrısı yapar ve ardından bu proxy değerlerine göre sıralar.

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

arama key=len ile sıralandı

Başka bir örnek vermek gerekirse, anahtar işlevi olarak "str.lower"ın belirtilmesi, sıralamayı büyük harf ve küçük harf kullanımını aynı şekilde ele almaya zorlamanın bir yoludur:

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

Temel işlev olarak kendi MyFn'inizi de geçirebilirsiniz:

  ## 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']

Soyadına göre ve ada göre sıralama gibi daha karmaşık sıralama için itemgetter veya attrgetter işlevlerini kullanabilirsiniz. Örneğin:

  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)]

Sort() yöntemi

Sort() yöntemine alternatif olarak, bir listedeki Sort() yöntemi söz konusu listeyi artan düzende (ör.list. sort()) sıralar.Sort() yöntemi, temel listeyi değiştirir ve Yok değerini döndürür. Bu nedenle, aşağıdaki gibi kullanın:

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

Yukarıda, Sort() ile ilgili çok sık karşılaşılan bir yanlış anlaşılmadır. Bu, sıralanmış listeyi *döndürmez*. Sort() yöntemi bir listede çağrılmalıdır; numaralandırılabilir herhangi bir koleksiyonda çalışmaz (ancak yukarıdaki Sort() işlevi her şeyde çalışır). Sort() yöntemi, Sort() işlevinden önce gelir, bu nedenle bunu eski kodda görebilirsiniz. Sort() yönteminin yeni bir liste oluşturmasına gerek yoktur. Bu nedenle, sıralanacak öğelerin zaten bir listede olması durumunda bu işlem biraz daha hızlı olabilir.

Tuple'lar

Tuple, (x, y) koordinatı gibi öğelerin sabit boyutlu gruplamasıdır. Tuple'lar listelere benzer, ancak sabit olmaları ve boyutlarını değiştirmezler (içerilen öğelerden biri değişken olabileceği için gruplar kesinlikle sabit değildir). Tuple'lar, Python'da bir tür "struct" rolü oynar. Bu, biraz mantıksal ve sabit boyutlu değer grubunu aktarmanın kolay bir yoludur. Birden çok değer döndürmesi gereken bir işlev, yalnızca birkaç değer döndürebilir. Örneğin, 3 boyutlu koordinatların yer aldığı bir liste oluşturmak istersek, doğal piton temsili bir unsur listesi olur. Burada, her unsur bir (x, y, z) grup tutan 3 boyuttadır.

Tuple oluşturmak için değerleri parantez içinde virgülle ayrılmış olarak listelemeniz yeterlidir. "Boş" demeti yalnızca boş bir parantez çiftidir. Tuple öğelerindeki öğelere erişim bir liste gibidir; len(), [ ], for, in vb. aynı şekilde çalışır.

  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

1 bedenden oluşan bir unsur oluşturmak için yalnız öğenin ardından virgül gelmelidir.

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

Söz diziminde tuhaf bir durum olsa da, tuple ifadesi, parantez içine alınan sıradan durumdan ayırt edilebilmesi için virgül gereklidir. Bazı durumlarda parantezi çıkarabilirsiniz. Python, defter eklemek istediğiniz virgülleri görür.

Bir değişken adı aynı boyutta bir unsura atandığında, karşılık gelen tüm değerler atanır. Tuple'lar aynı boyutta değilse hata verir. Bu özellik listelerde de kullanılabilir.

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

Anlamaları Listeleme (isteğe bağlı)

Listeyi anlama özelliği daha gelişmiş bir özelliktir. Bu özellik bazı durumlarda işe yarar ancak alıştırmalar için gerekli değildir ve başlangıçta öğrenmeniz gereken bir şey değildir (yani bu bölümü atlayabilirsiniz). Liste anlama özelliği, tüm listeye genişleyen bir ifade yazmanın kompakt bir yoludur. [1, 2, 3, 4] şeklinde bir liste sayımız olduğunu varsayalım. Bunların karelerinin [1, 4, 9, 16] listesini hesaplamak için kullanılan liste şu şekildedir:

  nums = [1, 2, 3, 4]

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

Sözdizimi [ expr for var in list ] şeklindedir. for var in list, normal bir for-loop gibi görünür, ancak iki nokta üst üste (:) içermez. Sol tarafındaki expr, yeni listenin değerlerini vermek üzere her öğe için bir kez değerlendirilir. Aşağıda, her dizenin sonuna "!!!" eklenerek büyük harfle değiştirildiği bir dize örneği verilmiştir:

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

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

Sonucu daraltmak için for-loop döngüsünün sağına bir if testi ekleyebilirsiniz. Eğer testin değerlendirilmesi, sadece testin doğru olduğu öğeler dahil olmak üzere her öğe için yapılır.

  ## 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']

Alıştırma: list1.py

Bu bölümdeki materyalle ilgili alıştırma yapmak için list1.py'de sıralama ve Tuple'lar kullanan sonraki problemleri deneyin (Temel Alıştırmalar'da).