Sıralamanın en kolay yolu, bir listeyi alan ve bu öğeleri sıralı olarak içeren yeni bir liste döndüren "sort(list)" işlevidir. Orijinal liste değiştirilmez.
a = [5, 1, 4, 3] print(sorted(a)) ## [1, 3, 4, 5] print(a) ## [5, 1, 4, 3]
En yaygın yöntem, Order() işlevine liste iletmektir, ancak gerçekte yinelenebilir herhangi bir koleksiyonu giriş olarak alabilir. Eski list.sort() yöntemi, aşağıda ayrıntılı olarak açıklanan bir alternatiftir. Sort() işlevi, Sort() ile karşılaştırıldığında daha kolay kullanılır. Bu nedenle, sellers() işlevini kullanmanızı öneririz.
Sort() işlevi, isteğe bağlı bağımsız değişkenlerle özelleştirilebilir. sellers() isteğe bağlı bağımsız değişkeni ters=True (doğru) değerine sahiptir, ör. Sort(list, refund=True) olarak belirtilen bir anahtar kelime, verilerin geriye dönük olarak 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']
Özel Sıralama Şununla Anahtar=
Daha karmaşık özel sıralama için sellers() isteğe bağlı bir "key=" bir "anahtar" belirtmek fonksiyonel fonksiyondur. Anahtar işlevi 1 değer alıp 1 değer döndürür ve döndürülen "proxy" değeri değeri, sıralama içindeki karşılaştırmalar için kullanılır.
Örneğin, bir dize listesiyle key=len (yerleşik len() işlevi) belirtildiğinde, dizeler uzunluklarına göre en kısadan en uzuna doğru sıralanır. Sıralama, proxy uzunluk değerlerinin listesini almak üzere her bir dize için len() çağrısı yapar ve ardından bu proxy değerleriyle sıralama yapar.
strs = ['ccc', 'aaaa', 'd', 'bb'] print(sorted(strs, key=len)) ## ['d', 'bb', 'ccc', 'aaaa']
Başka bir örnek olarak, "str.lower"ın belirtilmesi büyük harf ve küçük harf kullanımı, sıralamada aynı şekilde davranmaya zorlamanın bir yoludur:
## "key" argument specifying str.lower function to use for sorting print(sorted(strs, key=str.lower)) ## ['aa', 'BB', 'CC', 'zz']
Ayrıca, temel işlev olarak kendi MyFn'inizi de iletebilirsiniz:
## 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, ardından ada göre sıralama gibi daha karmaşık sıralamalar 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, listeyi artan düzende sıralar (ör. list.siral(). Sort() yöntemi temel listeyi değiştirir ve None değerini döndürür. Dolayısıyla, aşağıdaki gibi kullanın:
alist.sort() ## correct alist = blist.sort() ## Incorrect. sort() returns None
Yukarıda, Sort() işleviyle ilgili çok yaygın bir yanlış anlama vardır ve sıralanmış listeyi *döndürmez*. Sort() yöntemi bir liste üzerinde çağrılmalıdır; numaralandırılabilir hiçbir koleksiyonda çalışmaz (ancak yukarıdaki sellers() işlevi her şeyde çalışır). Sort() yöntemi, sellers() işlevinden önceki bir tarihte çalışır. Dolayısıyla, bu yöntemi büyük olasılıkla eski kodda görebilirsiniz. Sort() yönteminin yeni bir liste oluşturması gerekmez. Bu nedenle, sıralanacak öğeler zaten bir listede yer alıyorsa bu yöntem biraz daha hızlı olabilir.
Tuples
Tuple, (x, y) koordinat gibi sabit boyutlu bir öğe gruplamasıdır. Tuple'lar listelere benzer ancak değiştirilemez ve boyut değiştirmez (içerilen öğelerden biri değiştirilebileceği için unsur kesin olarak değiştirilemez değildir). Tuple'lar bir tür "struct" oyunu oynar rolünden bahsedeceğiz. Bu rol, küçük mantıksal, sabit boyutlu bir değer grubu iletmenin kolay bir yoludur. Birden çok değer döndürmesi gereken bir işlev, yalnızca bir değer grubunu döndürebilir. Örneğin, 3 boyutlu koordinatlardan oluşan bir liste elde etmek istersem, doğal python gösterimi, bir (x, y, z) grubunu içeren 3 boyutundaki demetlerin listesi olur.
Tuple oluşturmak için değerleri virgülle ayırarak parantez içinde listelemeniz yeterlidir. "Boş" demet yalnızca boş bir parantezdir. Bir unsurdaki öğelere erişmek tıpkı bir liste gibidir; len(), [ ], for, in vb. gibi öğelerin hepsi 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
Boyut-1 demeti oluşturmak için lone öğenin ardından virgül gelmelidir.
tuple = ('hi',) ## size-1 tuple
Söz diziminde komik bir durum kullanılmış olsa da, grubu parantez içine almada kullanılan sıradan örnekten ayırmak için virgül gereklidir. Bazı durumlarda parantezi çıkarabilirsiniz. Python, bir demeyi amaçladığınız virgülleri görür.
Aynı boyutta bir değişken adı grubuna bir demet atadığınızda, karşılık gelen tüm değerler atanır. Tuples 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
Kavramaları Listeleyin (isteğe bağlı)
Liste kavramaları daha gelişmiş bir özelliktir. Bu özellik bazı durumlarda kullanılabilir 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 kavraması, tüm listeye genişleyen bir ifade yazmak için kompakt bir yöntemdir. Bir liste sayımız [1, 2, 3, 4] olduğunu varsayalım. Bu değerleri [1, 4, 9, 16] hesaplayabilmek için liste anlamayı şöyle yapabilirsiniz:
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 döngüsü gibi görünür ancak iki nokta üst üste (:) içermez. Soldaki expr, yeni listeye değer vermek amacıyla her öğe için bir kez değerlendirilir. Aşağıda, her dizenin "!!!" ile büyük harf olacak şekilde değiştirildiği, dize içeren bir örnek verilmiştir. eklendi:
strs = ['hello', 'and', 'goodbye'] shouting = [ s.upper() + '!!!' for s in strs ] ## ['HELLO!!!', 'AND!!!', 'GOODBYE!!!']
Sonucu daraltmak için for döngüsünün sağına bir "if" testi ekleyebilirsiniz. Eğer testi her öğe için değerlendirilir (yalnızca testin doğru olduğu öğeler dahil).
## 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 dosyasında sıralama ve kavramlar kullanan sonraki soruları deneyin (Temel Alıştırmalar'da).