Bazı Pythonic Çözümler
-
Şimdiye dek bazı minik işler için sık kullandığım pythonic yollarıdan birkaç örnek paylaşayım dedim, varsa sizin de örnekleriniz faydalı bir konuya dönüştürebiliriz.
Bir listteki tekrar eden elementleri kaldırmak için:l = ["abc","tbt","def","ghi","tbt"] m = list(set(l))
Set veri tipi asla duplicate eleman bulundurmaz, list'i set'e dönüştürüp tekrar eden elemanları temizliyoruz sonra tekrar list'e dönüştürüyoruz. Yalnız set veri tipinde sıralama önemli değil, bu yüzden set'e dönüştürdüğünüzde elemanlarınızın sıralaması kayboluyor. Yani sizin için sıralamanın önemli olmadığı durumlarda bu yöntemi kullanmalısınız. ( https://stackoverflow.com/a/7961391/2946122 )
Peki sıralamayı muhafaza ederek tekrar eden elemanları temizlemek istiyorsanız?
from collections import OrderedDict OrderedDict((x, True) for x in source_list).keys()
Burada OrderedDict kullanarak list'imizdeki her elemanı sırayla bir dict'e aktarıyoruz ve değer olarak herhangi bir şey girebiliriz, örneğin burada True denmiş. Sonunda da keys() diyerek tekrarlı elemanı olmayan ve sıralı list'imizi elde etmiş oluyoruz. (https://stackoverflow.com/a/7961393/2946122)
Bir string'den tekrar eden boşlukları, tek boşluk haline getirmek için:
text = "Dalımızı kıranın ağacını kökünden sökeriz." new_text = ' '.join(text.split())
Yalnız bu yöntemded sadece boşluklar değil \t \n gibi karakterleri temizlediğini de unutmamak gerek. (https://stackoverflow.com/a/2077944/2946122)
Bir string'den noktalama işaretlerini temizlemek için:
Python 3
import string line = "Nush ile uslanmayanın hakkı tekdir, tekdir ile uslanmayanın hakkı kötektir." translator = str.maketrans('','',string.punctuation) new_line = line.translate(translator)
Python 2 (https://stackoverflow.com/a/266162/2946122)
import string line = "Nush ile uslanmayanın hakkı tekdir, tekdir ile uslanmayanın hakkı kötektir." new_line = line.translate(None, string.punctuation)
-
Pythonic mi bilmiyorum fakat.
Örnek:
re.findall() ile bize dönen veriler liste türünde geri dönmekte ve bunu 2-3 satır for döngüsü ile string şeklinde yazdırmaktayız.
onun yerine.
print([i for i in liste]) yaparsak string şeklinde geri döndürebilirsiniz. Eğer burada listede işlem yapmak isterseniz de
[i * 3 for i in liste if i == 2] şeklinde kullanıma gidebilirsiniz.
2 farklı listeyi tek bir for döngüsüne sokmak için
for i,b in zip(liste1,liste2):
print(i,b)
yapabilirsiniz.
Listenin öğelerinin sıra numarası için
for i in enumarate(liste):print(i)
yapabilirsiniz.
Pythonic değilse bile işe yarar. -
fazladan ram kullanımı dert olmayacak ise set ve list'i aynı anda kullanarak daha hızlı ve sıralı bir liste elde edilir
python'daki en hızlı liste set'tir, hem ekleme, hem sorgu açısından
en yavaşı ise tuple'dır sonra dict'tir
1 milyon satırlı (satır başına 1000 bayt) dosyayı yukarıdaki kod 5 saniyede hallederken
OrderedDict 8 saniyede hallediyor ve aralarında 200-300 mblık bi ram kullanım farkı oluyor sadece
ram kullanımı dert ise ve milyonlarca veriyi sıralı uniqeleştirmek isterseniz de
sqlite3'ün executemany fonksiyonunu bir adet generator fonksiyon ile destekleyerek uçabilirsiniz gene
-
bu kutsal konuyu uplayim :)
l = [("havuz", "yavuz"), ("cesme", "secme"), ("pinar", "cinar")] s = "Manastir'in ortasinda var bir %s\nCanim %s\nBu yurdun kizlari hepsi de %s\nBiz calar oynariz\n" for t in l: print s % (t[0], t[0], t[1])
edit:
https://www.youtube.com/watch?v=W8xni7BKjqk