SORU
20 Mayıs 2013, PAZARTESİ


Ne zaman bölme boş bir dize Python, neden split() dönüş boş liste ise split('\n') döndürür ['']?

split('\n') bir dize hatları almak için kullanıyorum, ve ''.split() ''.split('\n') [''] iade ederken boş bir liste, [] döndüren bulundu. Böyle bir fark için herhangi bir özel nedeni var mı?

Ve orada daha rahat bir şekilde dize satırları saymak için mi?

CEVAP
20 Mayıs 2013, PAZARTESİ


Soru: split ('') bir dize hatları için n\, ve onu buldum kullanıyorum ".() bölünmüş boş bir liste döndürür [],".('') verir\n ["]. split

str.split() yöntemi iki algoritmaları vardır. Eğer şayet herhangi bir argüman belirtilmemişse, boşluk tekrar çalışır böler. Eğer bir argüman verilirse, ancak tekrarlanan ishal ile tek bir sınırlayıcı olarak kabul edilir.

Boş bir dize bölme durumunda, ilk mod (değişken) boşluk yenir çünkü boş bir liste döndürür ve sonucu listeye koymak için değerleri vardır.

Buna karşılık, ikinci modu (\n gibi bir argüman ile) ilk boş alan üretecek. Eğer '\n'.split('\n'), iki alanı olacaktı (bir bölme, iki parça verir) yazılı olsaydı düşünün.

Soru: böyle bir fark için herhangi bir özel nedeni var mı?

Bu ilk veri boşluk değişen miktarlarda ile sütun hizalanır 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 modu tekrarlanan virgül boş alanları göstermek nerede CSV olarak ayrılmış veri için yararlı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']

Unutmayın, sonuç alanların sayısı bir sınırlayıcı sayısı daha fazla. İp kesme düşünün. Eğer hiçbir kesim yaparsanız, bir parça var. Bir kesim yapma, iki parça verir. İki kesim yapma, üç parça verir. Ve bu yüzden Python ilestr.split(ayırıcı)yöntem:

>>> ''.split(',')       # No cuts
['']
>>> ','.split(',')      # One cut
['', '']
>>> ',,'.split(',')     # Two cuts
['', '', '']

Soru: Ve daha uygun bir yolu bir dize satırları saymak için mi?

Evet, birkaç kolay yolu vardır. str.count() ve diğer kullanır str.splitlines()kullanır. Her iki şekilde son satır \neksik olmadığı sürece aynı cevabı verecektir. Eğer son satır eksikstr.splitlinesyaklaşım doğru cevabı verecektir. Ayrıca doğru olduğunu daha hızlı bir yöntem sayma yöntemi kullanır ama son satır 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    

Heck iki çok farklı algoritmalar ayakkabı boynuzlu, tek bir işlev Neden? @soru Kaz:

İmzastr.böl20 yaşında, o dönemin API bir dizi kesinlikle pragmatik. Mükemmel olmasa da, yöntem imzası "" ya.çok kötü değil mi Çoğunlukla, Guido API tasarım seçenekleri zaman test durdu.

Geçerli API avantajları da yok değil. Düşünün dizeleri gibi:

ps_aux_header  = "USER               PID  %CPU %MEM      VSZ"
patient_header = "name,age,height,weight"

Alanlara bu dizeleri ayırmak istediğinde insanlar her ikisi de aynı kelimeleri kullanmıyor tanımlamak eğilimindedir, "". split Kodu okumak için sorulduğunda fields = line.split()gibi veya fields = line.split(','), insanlar doğru ifadeleri yorumlamaya meyilliler "alanlara bir çizgi böler.

Microsoft Excel text-to-columns tool benzer API bir seçim yaptı ve içermektedir aynı araçta iki bölme algoritmaları. İnsanların zihinsel alan-bölme modeli gibi görünüyor birden fazla algoritma dahil olmasına rağmen tek bir kavram olarak bile.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Defence Videos

    Defence Vide

    13 Mayıs 2013
  • ELPRESADOR

    ELPRESADOR

    21 HAZİRAN 2008
  • Hollyscoop

    Hollyscoop

    30 Ocak 2007