文字列リストの要素から末尾の改行を削除します


122

次の形式の大量の単語リストを取得する必要があります。

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

次に、strip関数を使用して、次のようにします。

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

私が書いたものはうまくいくと思いましたが、次のようなエラーが出ます。

「「リスト」オブジェクトには属性「ストリップ」がありません」

これが私が試したコードです:

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
なぜ0〜19 strip_list回追加してから、削除した行を追加するのかを説明してください。そのコードには非常に悪臭があります。また、ファイルからそのようなものを取得した場合は、途中でそれを取り除く必要があります。大きなリストを作成してから、それを別の大きなリストにbashすることはお勧めできません。また、2、あなたのコードは最長の単語/行の長さを知ることに依存すべきではありません。少し後戻り-何を達成しようとしていますか?あなたは何をしますstrip_listか?
John Machin

回答:


211
>>> 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']

次に、stripped_list = map(str.strip、my_list)と言ってから、stripped_listを印刷して、この新しいリストを印刷できますか?
ジョージバロウズ

19
ただし、Python 2を使用してstr.stripいる場合は、リストにUnicode文字列が含まれていないことが確実な場合にのみ機能します。8ビット文字列とUnicode文字列の両方を含めることができる場合はlambda s: s.strip()、上記のように使用するかstripstringsモジュールからインポートできる関数を使用します。
Cito

Citoのコメントは、実際には最も多くの担当者に値するコメントです。OOPでは、マップと内包リストは同等ではありません。これは、関数ではなくパスメソッドだからです。
e-satis


39
次の点に注意してください。Python3.xを使用していてlist、リストを返したい場合は、にする必要がありますlist(map(str.strip, my_list))。また、リンクを確認してください
つまり、S


64

リスト内包表記を使用できます

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

またはmap関数:

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

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

3
2番目のバージョンのラムダは過剰です。
gddc

1
同じアプローチを使用して0、リストの先頭の値を使用して何でも実行できます。同じ結果リストにそれらを入れて何を成し遂げようとしているのか本当に想像できませんが
Karl Knechtel

4
Python 3では、「ラムダなし」の3番目の形式strip_list = list(map(str.strip, lines))は、map()がマップイテレータを返すためです。docs.python.org/3/library/functions.html#map
Devy

7

これは、PEP 202で定義されているリスト内包表記を使用して行うことができます。

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

私は名前をlistからmap:) に変更することを考えていました
Casey

3

他のすべての回答、および主にリストの理解については、素晴らしいです。しかし、あなたのエラーを説明するだけです:

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())

aインデックスではなく、リストのメンバーです。あなたが書くことができるのはこれです:

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

もう1つの重要なコメント:空のリストを次のように作成できます。

strip_list = [0] * 20

しかし、リストに.append 何かを追加するので、これはそれほど有用ではありません。あなたの場合、ストリップされた文字列を追加するときにアイテムごとにアイテムを作成するので、デフォルト値でリストを作成することは役に立ちません。

したがって、コードは次のようになります。

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

しかし、確かに、これはまったく同じものであるため、最良のものはこれです。

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

単なるaよりも複雑なものがある場合は.strip、これを関数に入れて、同じようにします。これは、リストを操作する最も読みやすい方法です。


2

末尾の空白のみを削除する必要がある場合はstr.rstrip()、を使用できます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']

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.