連結された文字列をタプルに分割し、空の文字列を無視する最も速い方法

Fastest way to split a concatenated string into a tuple and ignore empty strings


質問 written by MLister @2012-06-12 16:56:32Z

: 11 : 6 : 34

私はこのような連結された文字列を持っています:

my_str = 'str1;str2;str3;'

そして、私はそれにsplit関数を適用し、結果のリストをタプルに変換し、 split結果の空の文字列を取り除きたいと思います(最後の最後の「;」に注意してください)

これまでのところ、私はこれをやっています:

tuple(filter(None, my_str.split(';')))

(速度とスペースの点で)より効率的な方法はありますか?

コメント 1

@Levon、要点、申し訳ありませんが、私は急いでサンプル変数名を選んだだけです。ありがとう。

written by MLister @2012-06-12 16:59:40Z

コメント 2

「より良い」とはどういう意味か正確に説明してください。

written by NPE @2012-06-12 16:59:56Z

コメント 3

1.空のセグメントは、追加のためにのみ発生する可能性があり;最後に、またはリストの中央に空の文字列があるかもしれませんか?2.なぜ結果をタプルに変換したいのですか?通常、単にstr.split()によって返されたリストを使用するだけでstr.split()です。

written by スヴェンマーナッハ @2012-06-12 17:00:08Z

コメント 4

@robert、もっと速い方法は何ですか?

written by MLister @2012-06-12 17:00:27Z

コメント 5

これをどのデータセットに適用するかによって、この質問(書き込み、返信の読み取りなど)により多くの時間を費やす可能性が高くなります。そして最も遅い方法。これは、ここで何度も尋ねられる「最速の方法」Pythonの質問の少なくとも半分に当てはまります。

written by DSM @2012-06-12 17:04:17Z

回答 1 written by David Wolever @2012-06-12 16:59:39Z
9

これは非常に合理的な方法です。 いくつかの選択肢:

  • foo.strip(";").split(";") (文字列内に空のスライスがない場合)
  • [ x.strip() for x in foo.split(";") if x.strip() ] (各スライスから空白を削除するため)

これを行うための「最速の」方法は多くのことに依存しますが、ipythonの%timeit簡単に試すことができます:

In [1]: foo = "1;2;3;4;"

In [2]: %timeit foo.strip(";").split(";")
1000000 loops, best of 3: 1.03 us per loop

In [3]: %timeit filter(None, foo.split(';'))
1000000 loops, best of 3: 1.55 us per loop
コメント 1

これが後続についてのみである場合;str.rstrip()も使用できます。

written by スベンマーナック @2012-06-12 17:02:30Z

コメント 2

うん、間違いなく。stripは両端からそれらを削除します。

written by デビッドウォレバー @2012-06-12 17:28:30Z

回答 2 written by Levon @2012-06-12 22:50:43Z
12

これはどう?

    tuple(my_str.split(';')[:-1])
    ('str1', 'str2', 'str3')

文字列を;で分割します; 文字、およびすべての部分文字列(最後の部分、空の文字列を除く)をタプルに渡して、結果のタプルを作成します。

回答 3 written by exfizik @2012-06-12 17:02:44Z
4

末尾に空の文字列のみが必要な場合は、次を実行できます。

a = 'str1;str2;str3;'
tuple(a.split(';')[:-1])

または

or

回答 4 written by googler @2012-06-14 05:34:36Z
4

tuple(my_str.split(';')[:-1])試してください

回答 5 written by voithos @2012-06-12 17:02:17Z
2

はい、それは非常にPython的な方法です。 ジェネレーター式が好きな場合は、 filter()を次のように置き換えることもできます。

tuple(part for part in my_str.split(';') if part)

これには、各部品をインラインでさらに処理できるという利点があります。

str.split()ドキュメントにはstr.split()ように書かれていることに注意してください。

... sepが指定されていない場合、またはNoneの場合、空白文字列は区切り文字であり、空の文字列は結果から削除されます。

なぜこの特別なケースが他のセパレーターに許可せずに行われたのだろう...

回答 6 written by Ashwini Chaudhary @2012-06-12 17:01:19Z
1

分割してからスライスを使用します。

 my_str.split(';')[:-1]

または :

or :

コメント 1

OPは結果として、リストではなくタプルを望んでいると思う

written by レヴォン @2012-06-12 17:37:18Z