i = 0
for j in alist:
alist[i] = j.strip()
i+=1
o yapmanın daha iyi bir yolu var mı?
i = 0
for j in alist:
alist[i] = j.strip()
i+=1
o yapmanın daha iyi bir yolu var mı?
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. 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
"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
@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
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
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
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
imho, bu unpythonic. –
Sen liste comprehensions kullanabilirsiniz
stripped_list = [j.strip() for j in initial_list]
performansa
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
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
Bazı ilginç tartışmalar oldu burada, bu yüzden beni bir kriter sunalım: Yani
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
:
map(str.strip, my_list)
sadece biraz daha hızlı, hızlı yoludur Comperhensions'tan daha.
map
veya itertools.imap
Eğermy_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.
Upvoting. Eğer soruda yanlış bir şey varsa, yazara ne demeden aşağılama yapmak tamamen anlamsızdır. – KRyan
@DragoonWraith Duy, dinle. – chucksmash
Endeksleri kullanarak yineleme yapmak istiyorsanız, numaralandırma (alist) ' – Kos