Lesson 7
Listeler
1. Listeler
Programların çoğu sadece değişkenlerle çalışır. Ayrıca değişkenlerin listesini kullanırlar. Örneğin, bir program, bir sınıftaki öğrencilerle ilgili bilgileri, klavyeden veya bir dosyadan öğrencilerin listesini okuyarak işleyebilir. Sınıftaki öğrencilerin sayısındaki bir değişiklik, program kaynak kodunun değiştirilmesini gerektirmemelidir.
Önceden, bir dizinin elemanlarını işleme görevini zaten görmüştük - örneğin, dizinin en büyük öğesini hesaplarken. Ama tüm diziyi bilgisayar belleğinde tutmuyoruz. Bununla birlikte, bir çok problemde, dizinin tüm elemanlarını artan sırada ("bir sıralamayı sırala") yazdırmak zorunda olsaydık, tüm diziyi tutmak gerekir.
Bu verileri depolamak için, Python'da listelenen veri yapısını kullanabilirsiniz (çoğu programlama dilinde farklı terim kullanılır - “dizi”). Liste, dizideki karakterler gibi, 0 olarak numaralandırılmış öğeler dizisidir. Liste, öğeleri aşağıdaki gibi köşeli parantez içindeki öğeleri numaralandırarak manuel olarak ayarlanabilir:
Primes = [2, 3, 5, 7, 11, 13] Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
Primes
listenin 6 unsuru vardır: Primes[0] == 2
, Primes[1] == 3
, Primes[2] == 5
, Primes[3] == 7
, Primes[4] == 11
, Primes[5] == 13
. Rainbow
listesi, her biri dize olan 7 öğeye sahiptir.
Dize içindeki karakterler gibi liste öğeleri de negatif indekse sahip olabilir, örneğin, Primes[-1] == 13
, Primes[-6] == 2
. Negatif indeks, son elemandan başladığımız ve bir liste okunurken sola dönüş yaptığımız anlamına gelir.
Listedeki elemanların sayısını len
( listenin uzunluğu anlamında), örn. len(Primes) == 6
.
Dizelerden farklı olarak, bir listenin öğeleri değiştirilebilir; yeni değerler atayarak değiştirilebilirler.
Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet'] print(Rainbow[0]) Rainbow[0] = 'red' print('Print the rainbow') for i in range(len(Rainbow)): print(Rainbow[i])
Listeleri oluşturma ve okuma için çeşitli yollar düşünün. Öncelikle boş bir liste oluşturabilir (liste içermeyen liste, uzunluğu 0'dır) ve listeyi append
listenin append
. Örneğin, programın n
listesindeki eleman sayısını aldığını ve ardından listenin n
öğelerinin her birini ayrı bir satırda birer birer aldığını varsayalım. İşte bu formattaki giriş verilerinin bir örneği:
5 1809 1854 1860 1891 1925Bu durumda, bu gibi bir listeden okumayı aşağıdaki gibi düzenleyebilirsiniz:
a = [] # boş bir liste başlat n = int(input()) # listedeki elemanların sayısını oku for i in range(n): new_element = int(input()) # sonraki öğeyi oku a.append(new_element) # listeye ekle # Son iki satır bir tane ile değiştirilebilir: # a.append (int (giriş ())) print(a)
Gösterilen örnekte boş liste oluşturulur, ardından elemanların sayısı okunur, sonra liste satırlarını satır satır okuyup sonuna eklersiniz. Aynı şey, n
değişkeni kaydederek de yapılabilir:
a = [] for i in range(int(input())): a.append(int(input())) print(a)
Listeler için tanımlanmış birkaç işlem vardır: liste birleştirme (listelerin eklenmesi, diğer bir deyişle bir listenin diğerine yapıştırılması) ve tekrar (bir listenin bir sayıyla çarpılması). Örneğin:
a = [1, 2, 3] b = [4, 5] c = a + b d = b * 3 print([7, 8] + [9]) print([0, 1] * 3)
Sonuç listesi c
, [1, 2, 3, 4, 5]
d
eşit olacak ve d
nin bir listesi [4, 5, 4, 5, 4, 5]
eşit olacaktır. Bu farklı okuma listeleri sürecini düzenlemek sağlar: ilk listenin boyutunu dikkate ve elemanların arzu edilen sayıda bir liste oluşturmak, değişken üzerinden sonra döngü i
numarası 0 ile ve döngü içinde başlangıç okuma i
-inci elemanı listenin
a = [0] * int(input()) for i in range(len(a)): a[i] = int(input())
Bir listenin elemanlarını a
ile print(a)
; Bu, köşeli ayraçlarla çevrili ve virgülle ayrılmış liste öğelerini görüntüler. Genel olarak, bu rahatsız edici; Ortak olarak, tüm öğeleri bir satırda veya satır başına bir öğe olarak yazdırmak üzeresiniz. İşte bunun iki örneği, diğer döngü biçimlerini kullanarak:
a = [1, 2, 3, 4, 5] for i in range(len(a)): print(a[i])
Burada i
indeksi değiştirilir, daha sonra a[i]
öğesi görüntülenir.
a = [1, 2, 3, 4, 5] for elem in a: print(elem, end=' ')
Bu örnekte, liste öğeleri boşluklarla ayrılmış bir satırda görüntülenir ve değiştirilen dizin değil, değişkenin kendisinin değeridir (örneğin, for elem in ['red', 'green', 'blue']
için döngüde) for elem in ['red', 'green', 'blue']
değişken elem
ardı ardına 'red'
, 'green'
, 'blue'
değerleri alacaktır.
Son örneğe özellikle dikkat edin! Python ideolojisinin çok önemli bir parçasıdır for
bazı dizisinin tüm unsurları üzerinde yineleme yapmak kolay bir yol sağlar döngü. Python'un Pascal'dan ayrıldığı yer burasıdır, burada elementlerin indeksleri üzerinde yinelemek zorundasınız, fakat elementlerin kendileri üzerinde değil.
Python'daki diziler, dizeler, listeler, işlev range()
değerleri range()
(bunlar listeler değildir) ve diğer bazı nesnelerdir.
Burada, bir dizeden tüm rakamları ayıklamak ve sayısal bir liste oluşturmak için gerektiğinde for
döngüsünün kullanımını gösteren bir örnek verilmiştir.
# verilen: s = 'ab12c59p7dq' # listeden rakamları çıkarmanız gerekiyor # bunu yapmak için: # rakam == [1, 2, 5, 9, 7] s = 'ab12c59p7dq' digits = [] for symbol in s: if '1234567890'.find(symbol) != -1: digits.append(int(symbol)) print(digits)
2. Böl ve birleştirme yöntemleri
Liste öğeleri bir karakterle ayrılmış bir satırda verilebilir; bu durumda, tüm liste input()
kullanılarak okunabilir. Daha sonra, ilk dizeyi boşluklarla kesdikten sonra oluşan dizelerin listesini döndüren bir string yöntemi split()
kullanabilirsiniz. Örnek:
# giriş bir dizedir # 1 2 3 s = input() # s == '1 2 3' a = s.split() # a == ['1', '2', '3'] print(a)
Bu programı 1 2 3
giriş verileriyle çalıştırırsanız, liste a
['1', '2', '3']
eşit olacaktır. Liste, sayılardan değil, dizelerden oluşacaktır. Sayıların listesini almak isterseniz, liste öğelerini tek tek tamsayıya dönüştürmeniz gerekir:
a = input().split() for i in range(len(a)): a[i] = int(a[i]) print(a)
Python - jeneratörler özel büyüsünü kullanarak - aynı tek bir satırda yapılabilir:
a = [int(s) for s in input().split()] print(a)
(Bir sonraki bölümde bu kod çalışır nasıl açıklayacağız.) Gerçek numaralarının bir listesini okumak isterseniz, tip değiştirmek zorunda int
için float
.
Method split()
, liste öğeleri arasında ayraç olarak hangi dizenin kullanılacağını belirleyen isteğe bağlı bir parametreye sahiptir. Örneğin, yöntemi split('.')
Çağırmak, ilk dizeyi '.'
Karakterinin bulunduğu split('.')
ayırarak elde edilen listeyi döndürür '.'
karşılaşıldı:
a = '192.168.0.1'.split('.') print(a)
Python'da, tek satırlı komutları kullanarak dizelerin bir listesini görüntüleyebilirsiniz. Bunun için, yöntem join
kullanılır; Bu yöntemin bir parametresi vardır: dizelerin bir listesi. Verilen elemanların birleştirilmesiyle elde edilen dizgeyi döndürür ve ayırıcı listenin öğeleri arasına sokulur; Bu ayırıcı, uygulanan yöntem olan dizgeye eşittir. Bir önceki cümleyi ilk defa anlamadığınızı biliyoruz. :) Örneklere bak:
a = ['red', 'green', 'blue'] print(' '.join(a)) # kırmızı yeşil mavi dönüş print(''.join(a)) # redgreenblue dönüş print('***'.join(a)) # kırmızı verir *** yeşil *** mavi
Liste bir sayıdan oluşuyorsa, jeneratörlerin karanlık büyüsünü kullanmalısınız. Bir listenin elemanlarını boşluklarla ayrılmış olarak nasıl yazdırabilirsiniz:
a = [1, 2, 3] print(' '.join([str(i) for i in a])) # sonraki satır, bir tür hataya neden olur # join () olarak yalnızca strs birleştirebilir # yazdır ('' .join (a))
Ancak, karanlık büyü hayranı değilseniz, döngü for
aynı etkiyi elde edebilirsiniz.
3. Jeneratörler
Aynı öğelerle dolu bir liste oluşturmak için listenin tekrarını kullanabilirsiniz, örneğin:
n = 5 a = [0] * n print(a)
Daha karmaşık listeler oluşturmak için jeneratörler kullanabilirsiniz: bir listeye göre bir listeyi doldurmaya izin veren ifadeler. Bir jeneratörün genel şekli şöyledir:
[expression for variable in sequence]
variable
bazı değişkenin kimliği olduğu durumda, sequence
değişkeni alan bir değer dizisidir (bu, bir fonksiyon, bir dizi veya fonksiyon range
kullanarak elde edilen bir nesne olabilir), expression
- genellikle değişkendeki değişime bağlı olarak - Jeneratörde kullanılır. Liste elemanları bu ifadeye göre doldurulacak.
İşte jeneratörler kullanan bazı örnekler.
Jeneratörünü kullanarak n
sıfırların bir listesini oluşturursunuz:
a = [0 for i in range(5)] print(a)
Tamsayıların kareleriyle dolu bir liste nasıl oluşturursunuz:
n = 5 a = [i ** 2 for i in range(n)] print(a)
1'den n
kadar sayıların kareler listesini doldurmanız gerekiyorsa, range
ayarlarını range(1, n + 1)
:
n = 5 a = [i ** 2 for i in range(1, n + 1)] print(a)
Burada (kullanarak 1'den 9'a kadar rastgele numaraları ile dolu bir listesini almak için ne yapmanız randrange
modülünden random
):
from random import randrange n = 10 a = [randrange(1, 10) for i in range(n)] print(a)
Ve bu örnekte liste, standart girişten okunan satırlardan oluşacaktır: ilk olarak, listenin elemanlarının sayısını (bu değer fonksiyon range
argümanı olarak kullanılacaktır), ikinci olarak - dizge sayısını girmeniz gerekir:
a = [input() for i in range(int(input()))] print(a)
4. dilimler
Listeler ve dizelerle dilimler yapabilirsiniz. Yani:
A[i:j]
dilim ji
elemanları A[i]
, A[i+1]
, ..., A[j-1]
.
A[i:j:-1]
dilim ij
elemanları A[i]
, A[i-1]
, ..., A[j+1]
(yani, öğelerin sırasını değiştirerek).
A[i:j:k]
aşaması ile kesilmiş k
: A[i]
, A[i+k]
, A[i+2*k]
, .... Eğer k
<0 değeri ise, elemanlar karşıt sırayla gelir.
i
ya da j
numaralarının her biri eksik olabilir, “satırın başlangıcı” ya da “satırın sonu” anlamına gelir.
Listeler, dizelerden farklı olarak, değiştirilebilen nesnelerdir : bir liste öğesini yeni bir değere atayabilirsiniz. Ayrıca, tüm dilimleri değiştirmek mümkündür. Örneğin:
A = [1, 2, 3, 4, 5] A[2:4] = [7, 8, 9] print(A)
Burada bir liste [1, 2, 3, 4, 5]
aldık ve daha sonra üç elemanın yeni bir listesi ile A[2:4]
diliminin iki elemanını A[2:4]
değiştirmeyi deneyelim. Elde edilen liste şöyledir: [1, 2, 7, 8, 9, 5]
.
A = [1, 2, 3, 4, 5, 6, 7] A[::-2] = [10, 20, 30, 40] print(A)
Ve burada, sonuç listesi [40, 2, 30, 4, 20, 6, 10]
. Nedeni, A[::-2]
A[-1]
, A[-3]
, A[-5]
, A[-7]
elementlerinin bir listesidir ve bu elemanlar 10, 20, Sırasıyla 30, 40.
Süreksiz bir dilim (yani k
adımı k
olan bir dilim, k > 1
) yeni bir değer atandığında, eski ve yeni dilimlerdeki öğelerin sayısı zorunlu olarak çakışır, aksi halde ValueError
hatası oluşur.
A[i]
bir dilim değil, bir liste öğesi olduğunu unutmayın!
5. Listelerdeki işlemler
Listelerle birçok farklı işlemi kolayca yapabilirsiniz.
A içinde x | Listedeki bir öğeyi kontrol edin. Doğru veya Yanlış döndürür |
x A değil | Aynı değil (A'da x) |
mina) | Listenin en küçük öğesi |
v max (A) | Listedeki en büyük öğe |
A.index (x) | Listedeki ilk eleman x'in indeksi; yokluğunda bir istisna ValueError oluşturur |
A.count (x) | Listedeki x öğesinin gerçekleştiği olay sayısı |