2012-08-29 7 views
17

:Dizeler listesinde strip() öğesini kullanmanın daha iyi bir yolu var mı? - şimdi dizeleri listesinde şeridi() gerçekleştirmek için çalışıyorum ve ben bunu için piton

i = 0 
for j in alist: 
    alist[i] = j.strip() 
    i+=1 

o yapmanın daha iyi bir yolu var mı?

+7

Upvoting. Eğer soruda yanlış bir şey varsa, yazara ne demeden aşağılama yapmak tamamen anlamsızdır. – KRyan

+0

@DragoonWraith Duy, dinle. – chucksmash

+3

Endeksleri kullanarak yineleme yapmak istiyorsanız, numaralandırma (alist) ' – Kos

cevap

26

Bir tür olduğundan, büyük olasılıkla list değişken adı olarak kullanılmamalıdır. Ne olursa olsun:

list = map(str.strip, list) 

Bu, list her elemana işlevini str.strip uygulamak yeni bir liste dönmek ve list geri sonucunu depolar.

+1

+1. Ve eğer aynı liste örneğini değişkeni yeni bir taneye bağlamak yerine değiştirmek istiyorsanız (bu listeye diğer referansları kırmamaya dikkat edin), @kojiro gibi dilim sözdizimini kullanın – Kos

+2

"map" ifadesinin mükemmel olduğu bir örnek seçim. ('itertools.imap', elbette, örneğin, bir dilime atama yaparken daha iyi olabilir veya olmayabilir). – Marcin

+0

@Kos Bu durumda, yineleyici tabanlı bir çözüm daha iyi olacaktır (çünkü daha sonra ilgisiz ve çöp toplama bekleyen bir liste oluşturmayı önler). – Marcin

3

ben böyle daha iyi bir yaklaşım olabilir bir jeneratör ifadeyi kullanarak

a_list = [s.strip() for s in a_list] 

demek düşünüyorum:

stripped_list = (s.strip() for s in a_list) 

tembel değerlendirme avantajı sunar, böylece verildiğinde strip sadece çalışır elimden, öğütülmüş, gereklidir. Geçerli kapsamı dışında bozulmadan kalmasını listeye başvurular gerekiyorsa

, bunu gibi görünen, liste dilim sözdizimi .: çeşitli yaklaşımların hız ilgilenen Yorum yapanlar için

a_list[:] = [s.strip() for s in a_list] 

kullanmak isteyebilirsiniz CPython jeneratör-to-dilim yaklaşım az etkilidir:

>>> from timeit import timeit as t 
>>> t("""a[:]=(s.strip() for s in a)""", """a=[" %d " % s for s in range(10)]""") 
4.35184121131897 
>>> t("""a[:]=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""") 
2.9129951000213623 
>>> t("""a=[s.strip() for s in a]""", """a=[" %d " % s for s in range(10)]""") 
2.47947096824646 
+0

Neden profil ve kontrol yerine "sözde biraz daha verimli" diyorsunuz? Ve BTW '[:]' kullanışlıdır, çünkü o zaman aynı listeyi değiştirir, değişkeni yeni bir listeye yeniden atamaz. – Kos

+2

Bu * daha az * verimli çünkü listeye başvuru yerine yerine N öğeleri kopyalamak zorunda. İhtiyacınız olmayan veya istemeyebileceğiniz tek “avantaj”, değişikliğin orijinal liste nesnesine başka bir referans veren herkes tarafından görülebilir olmasıdır. – delnan

+0

imho, bu unpythonic. –

18

Sen liste comprehensions kullanabilirsiniz

stripped_list = [j.strip() for j in initial_list] 
performansa
+0

Söyleyeceğimiz liste anlamalarının kod çalışmasını hızlandırdığını mı düşünüyorsunuz? ya da sadece küçük ?? – Surya

+0

Liste kavramaları, basit kurallarla yinelenen nesne için çok verimlidir. Karmaşıklığa bağlı olarak haritaları ve liste anlamalarını kullanabilirsiniz. Ama evet, hızlı ve verimli bir uygulama sağlıyorlar – karthikr

7

Bazı ilginç tartışmalar oldu burada, bu yüzden beni bir kriter sunalım: Yani

http://ideone.com/ldId8

noslice_map    : 0.0814900398254 
slice_map    : 0.084676027298 
noslice_comprehension : 0.0927240848541 
slice_comprehension  : 0.124806165695 
iter_manual    : 0.133514881134 
iter_enumerate   : 0.142778873444 
iter_range    : 0.160353899002 

:

  1. map(str.strip, my_list) sadece biraz daha hızlı, hızlı yoludur Comperhensions'tan daha.
    • kullanın map veya itertools.imap Eğer
  2. Manuel yineleme yavaş yoludur daha karmaşık bir ifade varsa
  3. Kullanım comprehensions (str.split gibi) uygulamak istediğiniz tek bir işlev varsa; Makul bir açıklama, tercümanın daha fazla iş yapmasını ve verimli C çalışma zamanının daha azını gerektirdiğidir.
  4. Devam edin ve sonucu my_list[:] = map... olarak atayın, dilim notasyonu yalnızca küçük bir ek yük getiriyor ve eğer varsa, bazı hatalar size yardımcı olacaktır. bu listeye birden çok referans var.
    • Bir listeyi dönüştürmek ve yeniden oluşturmak arasındaki farkı öğrenin.rasgele anonim uncommented downvote için
+0

Bunu mu demek istediniz? My_list = map (str.strip, list [:]) '? Çünkü diğer yol bana bir NameError veriyor. – Izkata

+0

'my_list [:] = map (str.strip, my_list)' diyorum. Bağlantı altındaki kodlara bakın. – Kos

İlgili konular