'/segment/segment/'.split('/')
帰る意味は['', 'segment', 'segment', '']
?
空の要素に注目してください。たまたま位置1で文字列の最後にある区切り文字で分割している場合、両端から空の文字列が返されるようにするには、どのような余分な値が必要ですか?
strip()
、分割前の文字列から先頭と末尾の分割文字を削除する:'/segment/segment/'.strip('/').split('/')
'/segment/segment/'.split('/')
帰る意味は['', 'segment', 'segment', '']
?
空の要素に注目してください。たまたま位置1で文字列の最後にある区切り文字で分割している場合、両端から空の文字列が返されるようにするには、どのような余分な値が必要ですか?
strip()
、分割前の文字列から先頭と末尾の分割文字を削除する:'/segment/segment/'.strip('/').split('/')
回答:
str.split
補完するstr.join
ので、
"/".join(['', 'segment', 'segment', ''])
元の文字列に戻します。
空の文字列がそこになかった場合、最初と最後'/'
は、join()
より一般的には、split()
結果で返された空の文字列を削除するには、filter
関数を確認する必要があります。
例:
filter(None, '/segment/segment/'.split('/'))
戻り値
['segment', 'segment']
list(...)
ます。
ここで考慮すべき主な点が2つあります。
'/segment/segment/'.split('/')
が等しいと期待すること['segment', 'segment']
は合理的ですが、これは情報を失います。場合はsplit()
、あなたが望んでいた道を働いていた私はあなたのことを教えている場合、a.split('/') == ['segment', 'segment']
あなたは何を私に伝えることはできませんa
でした。'a//b'.split()
ですか?['a', 'b']
?、または['a', '', 'b']
?つまり、split()
隣接する区切り文字をマージする必要がありますか?必要な場合は、文字で区切られたデータを解析することが非常に難しくなり、一部のフィールドが空になる場合があります。上記のケースの結果に空の値が必要な人がたくさんいると確信しています!結局、それは2つのことに要約されます:
一貫性:n
区切り文字がある場合、でa
、の後にn+1
値が返されますsplit()
。
複雑なことを実行でき、簡単なことを簡単に実行できるはずです。の結果として空の文字列を無視したい場合はsplit()
、いつでも実行できます。
def mysplit(s, delim=None):
return [x for x in s.split(delim) if x]
しかし、空の値を無視したくない場合は、できるはずです。
言語は1つの定義を選択するsplit()
必要があります。さまざまなユースケースが多すぎて、デフォルトとして全員の要件を満たすことができません。Pythonの選択は良い選択であり、最も論理的だと思います。(余談ですが、Cが気に入らない理由の1つは、strtok()
隣接する区切り文字をマージするため、Cで本格的な解析/トークン化を行うことが非常に困難になるためです。)
例外が1つあります。a.split()
引数を指定しないと、連続する空白が圧縮されますが、その場合はこれが正しいことだと主張できます。動作を望まない場合は、いつでもできますa.split(' ')
。
python3 -m timeit "import re ; re.sub(' +', ' foo bar baz ', '').split(' ')"
。->ループあたり875ナノ秒。python3 -m timeit "[token for token in ' foo bar baz '.split(' ') if token]"
->ループあたり616
持っx.split(y)
いつものリストを返す1 + x.count(y)
@ gnibblerさんはすでに落札指摘したように-アイテムは貴重な規則性であるsplit
とjoin
(彼らは明らかであるべきと)お互いの正確な逆で、それも正確に(区切り文字に参加しているレコードのすべての種類の意味をマップします以下のようなcsv
ファイルの行[[引用問題のネット]]、からライン/etc/group
ローマの答えが述べた@としてのUnixで、など)、それは、ファイルパスやURLでの相対パス()対のための簡単なチェック(例えば)絶対)(ことができますなど。
それを見る別の方法は、利益を得るためにウィンドウから情報を投げ捨てるだけではいけないということです。とx.split(y)
同等のものにすることで何が得られx.strip(y).split(y)
ますか?何も、もちろん-それはそれはあなたが何を意味するかだときに、第2のフォームを使用するのは簡単ですませんが、最初のフォームを任意秒1を意味するものとみなされた場合は、とき、あなたがやるべき仕事がたくさんあると思います(最初のものが欲しいです前の段落で指摘したように、これはまれではありません。
しかし、実際には、数学的な規則性の観点から考えることが、合格可能なAPIを設計するための最も簡単で最も一般的な方法です。別の例をとるには、有効なx
andが非常に重要です。y
x == x[:y] + x[y:]
これは、スライスの1つの極端を除外する必要がある理由をすぐに示します。作成できるインバリアントアサーションが単純であるほど、結果のセマンティクスは実際の使用に必要なものであると考えられます。つまり、数学は宇宙の扱いに非常に役立つという神秘的な事実の一部です。
split
先頭と末尾の区切り文字が特殊なケースである方言の不変式を定式化してみてください...反例:次のような文字列メソッドisspace
は最大限に単純ではありません- x.isspace()
に相当しますx and all(c in string.whitespace for c in x)
-ばかげた先導x and
がコーディングを見つけやすい理由ですnot x or x.isspace()
、文字列メソッドに設計されるべきであった単純さを取り戻すためにis...
(空の文字列はあなたが望むものであり、それによって通りの馬の感覚に反して、おそらく[[空のセット、ゼロのように&c、ほとんどの人を常に混乱させてきました;-)]]ですが、明確で洗練された数学的常識に完全に準拠しています!-)。
どのような答えを探しているのかわかりませんか?3つの区切り文字があるため、3つの一致が得られます。空のものを使いたくない場合は、次のように使用します。
'/segment/segment/'.strip('/').split('/')