Pertanyaan: Saya menggunakan split ('\ n') untuk mendapatkan baris dalam satu string, dan menemukan bahwa '' .split () mengembalikan daftar kosong [], sedangkan '' .split ('\ n') mengembalikan [''] .
Metode str.split () memiliki dua algoritma. Jika tidak ada argumen yang diberikan, itu terbagi pada menjalankan spasi putih berulang. Namun, jika argumen diberikan, itu diperlakukan sebagai pembatas tunggal tanpa berjalan berulang.
Dalam kasus pemisahan string kosong, mode pertama (tanpa argumen) akan mengembalikan daftar kosong karena spasi kosong dimakan dan tidak ada nilai untuk dimasukkan ke dalam daftar hasil.
Sebaliknya, mode kedua (dengan argumen seperti \n
) akan menghasilkan bidang kosong pertama. Pertimbangkan jika Anda telah menulis '\n'.split('\n')
, Anda akan mendapatkan dua bidang (satu split, memberi Anda dua bagian).
Pertanyaan: Apakah ada alasan khusus untuk perbedaan seperti itu?
Mode pertama ini berguna ketika data disejajarkan dalam kolom dengan jumlah spasi kosong yang bervariasi. Sebagai contoh:
>>> 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']
Mode kedua berguna untuk data yang dibatasi seperti CSV di mana koma berulang menunjukkan bidang kosong. Sebagai contoh:
>>> 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']
Catatan, jumlah bidang hasil adalah satu lebih besar dari jumlah pembatas. Pikirkan memotong tali. Jika Anda tidak memotong, Anda memiliki satu potong. Membuat satu potong, beri dua potong. Membuat dua potongan, beri tiga potong. Dan demikian pula dengan str.split (pembatas) Python metode :
>>> ''.split(',') # No cuts
['']
>>> ','.split(',') # One cut
['', '']
>>> ',,'.split(',') # Two cuts
['', '', '']
Pertanyaan: Dan apakah ada cara yang lebih mudah untuk menghitung garis dalam sebuah string?
Ya, ada beberapa cara mudah. Satu menggunakan str.count () dan yang lainnya menggunakan str.splitlines () . Kedua cara akan memberikan jawaban yang sama kecuali jika baris terakhir tidak ada \n
. Jika baris akhir terakhir tidak ada, pendekatan str.splitlines akan memberikan jawaban yang akurat. Teknik yang lebih cepat yang juga akurat menggunakan metode penghitungan tetapi kemudian memperbaikinya untuk baris baru terakhir:
>>> 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
Pertanyaan dari @Kaz: Kenapa sih dua algoritma yang sangat berbeda bertanduk sepatu menjadi satu fungsi?
Tanda tangan untuk str.split berusia sekitar 20 tahun, dan sejumlah API dari era itu sangat pragmatis. Meskipun tidak sempurna, metode tanda tangan juga tidak "mengerikan". Sebagian besar, pilihan desain API Guido telah teruji oleh waktu.
API saat ini bukan tanpa kelebihan. Pertimbangkan string seperti:
ps_aux_header = "USER PID %CPU %MEM VSZ"
patient_header = "name,age,height,weight"
Ketika diminta untuk memecah string ini menjadi bidang, orang cenderung menggambarkan keduanya menggunakan kata bahasa Inggris yang sama, "split". Ketika diminta membaca kode seperti fields = line.split()
atau fields = line.split(',')
, orang cenderung menafsirkan pernyataan dengan benar sebagai "membagi baris menjadi bidang".
Alat teks-ke-kolom Microsoft Excel membuat pilihan API yang serupa dan menggabungkan kedua algoritma pemisahan dalam alat yang sama. Orang-orang tampaknya secara mental memodelkan field-splitting sebagai konsep tunggal meskipun lebih dari satu algoritma yang terlibat.