Soru: Bir dizede satır almak için split ('\ n') kullanıyorum ve '' .split () boş liste [] döndürürken, '' .split ('\ n') [''] döndürdü .
Str.split () metodu iki algoritmaları bulunmaktadır. Herhangi bir argüman verilmezse, tekrarlanan boşluk alanlarına ayrılır. Ancak, bir argüman verilirse, yinelenen çalışma olmadan tek bir sınırlayıcı olarak ele alınır.
Boş bir dizenin bölünmesi durumunda, beyaz alan yenildiği ve sonuç listesine konacak değer olmadığından ilk mod (bağımsız değişken yok) boş bir liste döndürür.
Buna karşılık, ikinci mod (gibi bir argümanla \n
) ilk boş alanı oluşturur. Yazmış olsaydınız '\n'.split('\n')
, iki alan elde edeceğinizi düşünün (bir bölme, size iki yarı verir).
Soru: Böyle bir farkın belirli bir nedeni var mı?
Bu ilk mod, veriler değişken miktarlarda boşluk içeren sütunlarda hizalandığında yararlıdır. Örneğin:
>>> data = '''\
Shasta California 14,200
McKinley Alaska 20,300
Fuji Japan 12,400
'''
>>> for line in data.splitlines():
print line.split()
['Shasta', 'California', '14,200']
['McKinley', 'Alaska', '20,300']
['Fuji', 'Japan', '12,400']
İkinci mod, tekrarlanan virgüllerin boş alanları gösterdiği CSV gibi sınırlandırılmış veriler için kullanışlıdır. Örneğin:
>>> data = '''\
Guido,BDFL,,Amsterdam
Barry,FLUFL,,USA
Tim,,,USA
'''
>>> for line in data.splitlines():
print line.split(',')
['Guido', 'BDFL', '', 'Amsterdam']
['Barry', 'FLUFL', '', 'USA']
['Tim', '', '', 'USA']
Sonuç alanlarının sayısının, sınırlayıcı sayısından bir fazla olduğunu unutmayın. Bir ip kesmeyi düşünün. Kesim yapmazsan, bir parçan var. Bir kesim yapmak, iki parça verir. İki kesim yapmak, üç parça verir. Ve böylece Python'un str.split (ayırıcı) yöntemi ile:
>>> ''.split(',') # No cuts
['']
>>> ','.split(',') # One cut
['', '']
>>> ',,'.split(',') # Two cuts
['', '', '']
Soru: Bir dizedeki çizgileri saymanın daha uygun bir yolu var mı?
Evet, birkaç kolay yol var. Birinde str.count () kullanılır , diğerinde str.splitlines () kullanılır . Son satırda eksik olmadıkça her iki yol da aynı cevabı verecektir \n
. Eğer son satırsonu eksikse, str.splitlines yaklaşımı doğru cevabı verecektir. Aynı zamanda doğru olan daha hızlı bir teknik sayma yöntemini kullanır, ancak daha sonra son satırsonu için düzeltir:
>>> data = '''\
Line 1
Line 2
Line 3
Line 4'''
>>> data.count('\n') # Inaccurate
3
>>> len(data.splitlines()) # Accurate, but slow
4
>>> data.count('\n') + (not data.endswith('\n')) # Accurate and fast
4
@Kaz'dan Soru: Neden halt tek bir fonksiyona ayakkabı boynuzlu iki farklı algoritma?
Str.split imzası yaklaşık 20 yaşındadır ve o döneme ait bazı API'lar kesinlikle pragmatiktir. Mükemmel olmasa da, yöntem imzası da "korkunç" değildir. Çoğunlukla, Guido'nun API tasarım seçenekleri zaman testini gerçekleştirdi.
Mevcut API'nin avantajları yoktur. Aşağıdaki gibi dizeleri düşünün:
ps_aux_header = "USER PID %CPU %MEM VSZ"
patient_header = "name,age,height,weight"
Bu dizeleri alanlara ayırmanız istendiğinde, insanlar her ikisini de aynı İngilizce kelime olan "split" i kullanarak tanımlama eğilimindedir. fields = line.split()
Veya gibi bir kod okuması istendiğinde fields = line.split(',')
, insanlar ifadeleri "bir satırı alanlara ayırır" şeklinde doğru yorumlama eğilimindedir.
Microsoft Excel'in metin-sütun aracı benzer bir API seçimi yaptı ve her iki bölme algoritmasını da aynı araçta birleştirdi. Birden fazla algoritma olmasına rağmen, insanlar zihinsel olarak bölünmeyi tek bir kavram olarak modelliyor gibi görünmektedir.