Bir dize listesinin öğelerinden sondaki yeni satırı kaldırın


123

Şu biçimde geniş bir kelime listesi almam gerekiyor:

['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']

ve sonra şerit işlevini kullanarak bunu şuna çevirin:

['this', 'is', 'a', 'list', 'of', 'words']

Yazdıklarımın işe yarayacağını düşündüm, ancak şöyle bir hata alıyorum:

"Liste" nesnesinin "şerit" özniteliği yok "

İşte denediğim kod:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())

1
Lütfen neden 0 ila strip_list19 kez eklediğinizi açıklayın ve ardından soyulmuş satırlarınızı ekleyin. Bu kodun çok kötü bir kokusu var. Ayrıca, o şeyi bir dosyadan aldıysanız, yolda büyük bir liste oluşturup daha sonra başka bir büyük listeye sıkıştırmanız iyi bir fikir değildir. Ayrıca 2, kodunuz en uzun kelimenin / satırın uzunluğunu bilmenize bağlı olmamalıdır. Biraz geri adım atın - neyi başarmaya çalışıyorsunuz? Ne ile yapacak strip_list?
— John Machin

Yanıtlar:


212
>>> my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> map(str.strip, my_list)
['this', 'is', 'a', 'list', 'of', 'words']

daha sonra stripped_list = map (str.strip, my_list) diyebilir ve sonra bu yeni listeyi yazdırmak için stripped_list yazdırabilir miyim?
— George Burrows

19
Python 2 kullanıyorsanız, bunun str.stripyalnızca listenin unicode dizeleri içermediğinden eminseniz işe yaradığını unutmayın . Hem 8-bit hem de unicode dizeleri içerebiliyorsa, lambda s: s.strip()yukarıda belirtildiği gibi kullanın veya modülden stripiçe aktarabileceğiniz işlevi kullanın strings.
— Cito

Cito yorumu, aslında en çok repliği hak eden yorumdur. harita ve anlama listeleri OOP'de eşdeğer değildir, çünkü biz işlev değil, passe yöntemiz.
— e-satis

samaritan'da yerleşik harita işlevi
— SIslam

39
Aşağıdakilerden farkında olun: Python 3.x kullanıyorsanız ve bir liste dönmek isterseniz, gerek listo yüzden o, list(map(str.strip, my_list)). Ayrıca şuna da bakın: bağlantı .
— Yani


65

Liste anlayışlarını kullanabilirsiniz :

strip_list = [item.strip() for item in lines]

Veya mapişlev:

# with a lambda
strip_list = map(lambda it: it.strip(), lines)

# without a lambda
strip_list = map(str.strip, lines)

3
İkinci versiyondaki lambda aşırıdır.
— gddc

1
0Listenin başındaki değerlerle de ne olursa olsun yapmak için aynı yaklaşımı kullanabilirsiniz . Onları aynı sonuç listesine koyarak neyi başarmaya çalıştığınızı gerçekten hayal edemiyorum ...
— Karl Knechtel

4
Python 3'te, "lambdasız" 3. biçim strip_list = list(map(str.strip, lines)), map () bir harita yineleyicisi döndürdüğü için olmalıdır . docs.python.org/3/library/functions.html#map
— Devy

7

Bu, PEP 202'de tanımlanan liste anlayışları kullanılarak yapılabilir.

[w.strip() for w in  ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']]

Ben adını değiştirerek düşünüyordum listiçin map:)
— Casey

3

Diğer tüm cevaplar ve esas olarak listeyi anlama ile ilgili harika. Ancak hatanızı açıklamak için:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())

alistenizin bir üyesidir, bir dizin değil. Yazabileceğiniz şey şudur:

[...]
for a in lines:
    strip_list.append(a.strip())

Bir başka önemli yorum: bu şekilde boş bir liste oluşturabilirsiniz:

strip_list = [0] * 20

Ancak bu, listenize bir şeyler .append eklediği için o kadar kullanışlı değildir . Sizin durumunuzda, soyulmuş dizeleri eklerken öğe başına öğe oluşturacağınız için varsayılan değerleri olan bir liste oluşturmak kullanışlı değildir.

Yani kodunuz şöyle olmalıdır:

strip_list = []
for a in lines:
    strip_list.append(a.strip())

Ama elbette, en iyisi bu, çünkü bu tam olarak aynı şey:

stripped = [line.strip() for line in lines]

Eğer a'dan daha karmaşık bir şeye sahipseniz .strip, bunu bir işleve koyun ve aynısını yapın. Listelerle çalışmanın en okunaklı yolu budur.


2

Yalnızca sondaki beyaz boşluğu kaldırmanız gerekiyorsa , şunu kullanabilirsiniz str.rstrip(); bu, şunlardan biraz daha verimli olacaktır str.strip():

>>> lst = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> [x.rstrip() for x in lst]
['this', 'is', 'a', 'list', 'of', 'words']
>>> list(map(str.rstrip, lst))
['this', 'is', 'a', 'list', 'of', 'words']

-1
my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
print([l.strip() for l in my_list])

Çıktı:

['this', 'is', 'a', 'list', 'of', 'words']

diğer eski cevaplarla aynı
— Jean-François Fabre
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.