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.