Saya menggunakan split('\n')
untuk mendapatkan baris dalam satu string, dan menemukan bahwa ''.split()
mengembalikan daftar kosong []
,, sambil ''.split('\n')
mengembalikan ['']
. Apakah ada alasan khusus untuk perbedaan seperti itu?
Dan apakah ada cara yang lebih mudah untuk menghitung garis dalam sebuah string?
Jawaban:
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).Mode pertama ini berguna ketika data disejajarkan dalam kolom dengan jumlah spasi kosong yang bervariasi. Sebagai contoh:
Mode kedua berguna untuk data yang dibatasi seperti CSV di mana koma berulang menunjukkan bidang kosong. Sebagai contoh:
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 :
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: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:
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()
ataufields = 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.
sumber
Sepertinya itu hanya cara yang seharusnya berfungsi, menurut dokumentasi :
Jadi, untuk membuatnya lebih jelas,
split()
fungsi mengimplementasikan dua algoritma pemisahan yang berbeda, dan menggunakan keberadaan argumen untuk memutuskan mana yang akan dijalankan. Ini mungkin karena memungkinkan mengoptimalkan yang tanpa argumen lebih dari yang dengan argumen; Saya tidak tahusumber
.split()
tanpa parameter mencoba menjadi pintar. Itu terbagi pada spasi putih, tab, spasi, umpan baris dll, dan juga melewatkan semua string kosong sebagai akibat dari ini.Pada dasarnya,
.split()
tanpa parameter digunakan untuk mengekstrak kata-kata dari string, berbeda.split()
dengan parameter yang hanya mengambil string dan membaginya.Itulah alasan perbedaannya.
Dan ya, menghitung garis dengan memisahkan bukanlah cara yang efisien. Hitung jumlah umpan baris, dan tambahkan satu jika string tidak diakhiri dengan umpan baris.
sumber
Gunakan
count()
:sumber
cat file
perintah baris dan subversi Anda akan dikeluhkan. vi selalu menambahkan satu.Perhatikan kalimat terakhir.
Untuk menghitung garis, Anda cukup menghitung berapa banyak
\n
yang ada:Bagian terakhir memperhitungkan baris terakhir yang tidak berakhir
\n
, meskipun ini berartiHello, World!
danHello, World!\n
memiliki jumlah baris yang sama (yang bagi saya masuk akal), jika tidak, Anda dapat menambahkan1
ke dalam hitungan\n
.sumber
Untuk menghitung garis, Anda dapat menghitung jumlah jeda baris:
Edit :
Jawaban lain dengan built-in
count
lebih cocok, sebenarnyasumber
count
, bools dapat ditambahkan (pada kenyataannya, mereka subkelasint
), sehingga genexp dapat ditulis sebagaisum(s == "\n" for s in the_string)
.