2017-02-14 9 views
1

なぜstr.split()はNothing項目を削除するのですか?なぜstr.split()はNothing項目を削除するのですか?

>>> s = 'this is an irritating string with random spacing .' 
>>> s.strip().split(' ') 
['this', 'is', '', '', 'an', '', '', 'irritating', 'string', 'with', '', 'random', 'spacing', '', '.'] 
>>> s.strip().split() 
['this', 'is', 'an', 'irritating', 'string', 'with', 'random', 'spacing', '.'] 

docsによれば:9月が与えられた場合

str.split(SEP =なし、maxsplit個= -1)

、連続する区切り文字を一緒にグループ化されていないと空の文字列を区切るとみなされます(たとえば、 '1、、2'.split('、 ')は[' 1 '、' '、' 2 ']を返します)。 sep引数は複数の文字で構成されています(たとえば、 '1 <> 2 <> 3'.split(' <> ')は[' 1 '、' 2 '、' 3 ']を返します)。空の文字列を指定した区切り文字で分割すると、['']が返されます。

sepが指定されていない場合、またはNoneの場合、別の分割アルゴリズムが適用されます。連続する空白の実行は単一の区切り文字とみなされ、先頭または末尾に空の文字列は含まれません末尾の空白。したがって、空の文字列または空白文字のみの文字列をNoneのセパレータで分割すると、[]が返されます。

のでがNoney項目を削除するには、次の神託の方法で、キーワード引数sep=を使用するには?

[w for w in s.strip().split(' ') if w] 

それだけ空白(\s\t\n)なら、str.split()は十分ではなく、我々は理解が必要な場合は、条件のリストでは、別の文字/ストリングに分割しようとしていると言うことができますされます。そうですか?

+0

空白文字はありません。私はNoneyが何を意味するのかも知らないが、この方法は文書化されているように機能する。あなたは文字列にNone要素がありません –

+2

'split()'を使わないのはなぜですか?さらに、実際に何をしようとしていますか? –

+0

サイドノート:引数なしの 'split'を使用している場合、' strip'を最初に呼び出すことは冗長です。 'split'は余分なメソッド呼び出しと一時的な' str'を追加することなく、先頭と末尾の空白をすでに削除します。 – ShadowRanger

答えて

1

あなたが鈍角になりたい場合は、あなたがfalsey項目を削除するためにfilter(None, x)を使用することができます。

>>> list(filter(None, '1,2,,3,'.split(','))) 
['1', '2', '3'] 

おそらく少ないPython的。具体的項目を反復処理するために明確であるかもしれない:これは、あなたが空の項目をスキップしてstr.splitは時々空の項目をスキップしているという事実に頼っていないことが明確になりますことを

for w in '1,2,,3,'.split(','): 
    if w: 
     … 

私は同じようにすぐに正規表現を使用したい、いずれかのセパレータの連続した実行をスキップする(ただし、最後に注意):

>>> re.split(r',+', '1,2,,3,') 
['1', '2', '3', ''] 

をまたはセパレータではありませんすべてのものを見つけるために:

>>> re.findall(r'[^,]+', '1,2,,3,') 
['1', '2', '3'] 

の方法をPythonの歴史の中に戻すには、splitsplitfieldsの2つの別々の関数があります。名前が目的を説明すると思います。最初の文字は任意の空白文字で分割され、任意のテキスト入力に役立ち、2番目の文字は区切られた入力で予想通りに動作します。それらはv1.6より前の純粋なPythonで実装されました。

0

さて、ドキュメントを理解するだけでよいと思うかもしれません。あなたの例では、ドキュメントで言及されているアルゴリズムの違いを実証しています。sepキーワード引数を使用しないと、sep=' 'を使用して空の文字列を投げ捨てるようなものです。ある行に複数のスペースがある場合、アルゴリズムはそれらを分割してNoneを見つけます。スペースで分割されたものがすべて必要だったということを明示していたので、Noneを空の文字列に変換します。 Noneを空文字列に変更することは、関数のシグネチャ(つまり、関数が返すもの)を変更することを避けるため、この場合は良い方法です。この場合、文字列のリストが返されます。以下は

「は、この=

>>> empty = ' ' 
>>> s = 'this is an irritating string with random spacing .' 
>>> empty.split() 
[] 
>>> empty.split(' ') 
['', '', '', ''] 

ご質問については、ちょうどなしsep引数で

-1

だけでなく、あなたの文字列 秒split()を使用して... 4つのスペースを空の文字列が異なって扱われる方法を示していますランダムな間隔を持つ刺激的な文字列です。 '、 空白が複数含まれているため、empty.split(' ')は返されません。

文字列sから余分な空白を削除する必要があり、結果を得ることができます。

関連する問題