Öğeleri dize olan bir listeden (diziden) yeni bir liste oluşturmak için, yalnızca belirli koşulları karşılayan dizelerin öğelerini çıkararak veya ikame, dönüştürme vb. gerçekleştirerek liste kavramalarını kullanın.
Liste anlamalarının kısa bir açıklamasından sonra aşağıdaki içerikler örnek kod ile açıklanmıştır.
- Belirli bir dizenin dahil edilip edilmediğine göre çıkarma (kısmi eşleşme)
- Belirli dizeyi değiştir
- Belirli bir dizeyle başlayarak veya başlamayarak ayıklayın
- Belirli bir dizeyle biterek veya bitmeyerek ayıklayın
- Davaya göre yargılandı ve çıkarıldı
- Büyük harf ve küçük harfe dönüştür
- Alfabetik karakterlerin mi yoksa sayısal karakterlerin mi kullanıldığını belirler ve bunları ayıklar
- Çoklu koşullar
- (bilgisayar) normal ifade
Listelerin farklı veri türlerini depolayabileceğini ve dizilerden kesinlikle farklı olduğunu unutmayın. Dizileri, bellek boyutu ve bellek adresleri veya büyük verilerin sayısal olarak işlenmesini gerektiren işlemlerde kullanmak istiyorsanız, dizi (standart kitaplık) veya NumPy kullanın.
- liste ekleme gösterimi
- Belirli bir dize içerir (kısmi eşleşme) \ İçermez:in
- Belirli dizeyi değiştir
- Belirli bir dizeyle başlar \ başlamıyor:startswith()
- Belirli bir karakter dizisiyle biter \ bitmez:endswith()
- Davaya göre yargılandı ve çıkarıldı
- Büyük harf ve küçük harfe dönüştür
- Alfabetik karakterlerin mi yoksa sayısal karakterlerin mi kullanıldığını belirler ve bunları ayıklar
- Çoklu koşullar
- (bilgisayar) normal ifade
liste ekleme gösterimi
Bir listeden yeni bir liste oluştururken, liste kavrayışlarını yazmak for döngülerinden daha kolaydır.
[expression for any variable name in iterable object if conditional expression]
Öğe yalnızca koşullu bir ifade ile seçilecekse, bir ifade tarafından işlenmez, bu nedenle aşağıdaki formu alır.
[variable name for variable name in original list if conditional expression]
if koşulu ifadesi, koşullu değilse ifadesi haline getirilirse, bir olumsuzlama olur ve koşullu ifadeyi karşılamayan öğeler çıkarılabilir.
Belirli bir dize içerir (kısmi eşleşme) \ İçermez:in
“Orijinal dizedeki belirli dize” içinde, orijinal dize belirli dizeyi içeriyorsa True değerini döndürür. Bu koşullu bir ifadedir.
in’in olumsuzlaması, in ile yapılmaz.
l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print(l_in)
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print(l_in_not)
# ['three999aaa', '000111222']
Belirli dizeyi değiştir
Liste öğelerinden oluşan bir dizeyi değiştirmek istiyorsanız, liste anlama gösterimindeki her öğe için replace() dize yöntemini kullanın.
Değiştirilecek dize yoksa if koşullu ifadede öğeyi seçmeye gerek yoktur çünkü replace() uygulanarak değiştirilmeyecektir.
l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
Belirli bir dize içeren bir öğenin tamamını değiştirmek istiyorsanız, onu in ile çıkarın ve üçlü operatörle işleyin. Üçlü operatör aşağıdaki biçimde yazılır.True Value if Conditional Expression else False Value
Liste anlama gösteriminin ifade bölümünün üçlü bir operatör olması sorun değil.
l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print(l_replace_all)
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']
Aşağıda parantez içine alınmış sonuçların bir özeti bulunmaktadır. Parantez kullanmaya alışkın değilseniz, anlamanız ve hatalardan kaçınmanız daha kolay olabilir. Dilbilgisi olarak parantez yazsanız bile sorun yok.
[('ZZZ' if ('XXX' in s) else s) for s in l]
in’in koşul olarak kullanılması, in’deki liste anlama gösterimi ile kafa karıştırıcıdır, ancak liste anlama gösteriminin ve üçlü operatörlerin sözdizimsel biçiminin farkındaysanız bu zor değildir.
Belirli bir dizeyle başlar \ başlamıyor:startswith()
Dize yöntemi, bağımsız değişkende belirtilen dizeyle başlıyorsa, startwith() işlevi true değerini döndürür.
l_start = [s for s in l if s.startswith('t')]
print(l_start)
# ['twoXXXbbb', 'three999aaa']
l_start_not = [s for s in l if not s.startswith('t')]
print(l_start_not)
# ['oneXXXaaa', '000111222']
Belirli bir karakter dizisiyle biter \ bitmez:endswith()
Dize yöntemi, dize, bağımsız değişkende belirtilen dizeyle bitiyorsa, true değerini döndürür.
l_end = [s for s in l if s.endswith('aaa')]
print(l_end)
# ['oneXXXaaa', 'three999aaa']
l_end_not = [s for s in l if not s.endswith('aaa')]
print(l_end_not)
# ['twoXXXbbb', '000111222']
Davaya göre yargılandı ve çıkarıldı
isupper(),islower() dize yöntemleri, bir dizenin tamamen büyük mü yoksa tamamen küçük mü olduğunu belirlemek için kullanılabilir.
l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']
Büyük harf ve küçük harfe dönüştür
Tüm karakterleri büyük veya küçük harfe dönüştürmek istiyorsanız, üst() ve alt() dize yöntemlerini kullanın. Diğer yöntemler arasında, yalnızca ilk harfi büyük yapan büyük harfle () ve büyük ve küçük harfleri değiştiren swapcase () bulunur.
Yukarıdaki ikame örneğinde olduğu gibi, yalnızca koşulu karşılayan öğeleri işlemek istiyorsanız üçlü operatörü kullanın.
l_upper_all = [s.upper() for s in l]
print(l_upper_all)
# ['ONEXXXAAA', 'TWOXXXBBB', 'THREE999AAA', '000111222']
l_lower_to_upper = [s.upper() if s.islower() else s for s in l]
print(l_lower_to_upper)
# ['oneXXXaaa', 'twoXXXbbb', 'THREE999AAA', '000111222']
Alfabetik karakterlerin mi yoksa sayısal karakterlerin mi kullanıldığını belirler ve bunları ayıklar
isalpha() ve isnumeric() dize yöntemleri, bir dizenin tamamen alfabetik mi, sayısal mı, vb. olup olmadığını belirlemek için kullanılabilir.
l_isalpha = [s for s in l if s.isalpha()]
print(l_isalpha)
# ['oneXXXaaa', 'twoXXXbbb']
l_isnumeric = [s for s in l if s.isnumeric()]
print(l_isnumeric)
# ['000111222']
Çoklu koşullar
Liste kavrayışlarının koşullu ifade kısmı birden çok koşul olabilir. Negatif “değil” koşulları da kullanılabilir.
Üç veya daha fazla koşullu ifade kullanırken, sonuç sıraya göre değişeceğinden, her grubu parantez () içine almak daha güvenlidir.
l_multi = [s for s in l if s.isalpha() and not s.startswith('t')]
print(l_multi)
# ['oneXXXaaa']
l_multi_or = [s for s in l if (s.isalpha() and not s.startswith('t')) or ('bbb' in s)]
print(l_multi_or)
# ['oneXXXaaa', 'twoXXXbbb']
(bilgisayar) normal ifade
Normal ifadeler son derece esnek işlemeye izin verir.
Eşleştiğinde re.match() tarafından döndürülen eşleşme nesnesi, koşullu bir ifadeyle değerlendirildiğinde her zaman doğru olarak belirlenir. Eşleşmiyorsa, koşullu ifadede yanlış olan Yok değerini döndürür. Bu nedenle, yalnızca normal ifadeyle eşleşen öğeleri ayıklamak istiyorsanız, daha önce olduğu gibi liste anlama ifadesinin koşullu ifade bölümüne re.match() uygulayın.
import re
l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_re_match = [s for s in l if re.match('.*XXX.*', s)]
print(l_re_match)
# ['oneXXXaaa', 'twoXXXbbb']
Bir normal ifadenin eşleşen kısmının yerini alan re.sub() da yararlıdır. Yalnızca eşleşen öğeleri çıkarmak ve değiştirmek için “if koşullu ifade” eklemeniz yeterlidir.
l_re_sub_all = [re.sub('(.*)XXX(.*)', r'\2---\1', s) for s in l]
print(l_re_sub_all)
# ['aaa---one', 'bbb---two', 'three999aaa', '000111222']
l_re_sub = [re.sub('(.*)XXX(.*)', r'\2---\1', s) for s in l if re.match('.*XXX.*', s)]
print(l_re_sub)
# ['aaa---one', 'bbb---two']