0

私はPythonを初めて使用し、次の問題を最もPython的な方法で解決するのに苦労しています。

.split('/', 2)3つの変数(変数a、b、c)に分割()および指定(最大)する必要がある文字列(以下に示す状態の例)があります。文字列は、3つのセグメントに分割する必要があるURLです。

文字列とそのセグメントは、次の例になります。

  • 'seg_a / seb_b / the_rest'-> a = seg_a, b = seg_b, c = the_rest
  • 'seg_a / the_rest'-> a = seg_a, b = None, c = the_rest
  • 'seg_a'-> a = seg_a, b = None, c = None

注:他に何も指定されていない場合、None値を指定する義務はありません。それらは単純に存在しない可能性があります(例2のb、例3のbおよびc)。

分割の結果が1項目の場合、変数aに与えられます。分割の結果が2項目の場合、変数aとcに与えられます。分割の結果が3項目の場合、そのセグメントは変数a、b、cに与えられます。

私はこれを達成する2つの方法を見つけましたが、どちらもPythonicではないように思われるため、この質問が発生します。

方法A:

Split.
Count.
Depending on count, appoint segments to variables with IF.. Elif.. Elif.. Else. statement

方法B: リスト内包表記とネストされたTry-Exceptブロックを使用します。元:

try:
    a, b, c = [i for i in to_split.split("/", 2)]
except ValueError:
    try:
        a, c =  [i for i in to_split.split("/", 1)]
        b = None
    except ValueError:
        a = to_split
        b, c = None, None

私の質問(短い):

  • この文字列をそのセグメントに分割し、それらを変数a、b、cに指定する正しいPythonの方法は何ですか?
4

3 に答える 3

1

私はするだろう:

l = to_split.split("/", 2)
a, b, c = l + [None] * (3 - len(l))
于 2013-01-26T16:37:38.767 に答える
0

私見、最もPythonicであるものは、最も賢いものではありません。シンプルで簡潔で、一目で理解できるものであれば、それを使用して 1 日を続けてください。課したいルールが

分割の結果が 1 項目の場合、変数 a に渡されます。
分割の結果が 2 項目の場合、変数 a と c に渡されます。
分割の結果が 3 つの場合は、変数 a、b、c に渡されます。

次に、メソッド A スタイルを実装します。

p = to_split.split("/", 2)
if len(p) == 1:
    a, = p
elif len(p) == 2:
    a, c = p
elif len(p) == 3:
    a, b, c = p
else:
    raise ValueError("could not parse {}".format(to_split))

私はこれを読んで、それが何をしているのかを正確に知ることができます。そこにバグがある場合 (交換bcたときなどlen(p) == 2)、問題が見つかったら簡単に修正できます。

変数を未定義のままにしておくのは少し奇妙に思えます。後で分岐して、 を取得しないようにする必要がありますNameError。これは、リファクタリングによって回避できる可能性があり、おそらく回避する必要があります。私の経験では、どこかが少しずれている可能性があります。他に何も変更しなくてもa, b, c = [None]*3、自分自身を含めます。

コードを保守しやすくするためのルールの 1 つは、アルゴリズムが行うべきことを誰かに伝えることと、コンピューターに行うことを伝える方法との間の距離を最小限に抑えるように努める必要があるということです。ここでは、あなたがやりたいことはほとんど Python に直接書き写せるので、私はそれをそのまま実行します。

于 2013-01-26T17:21:38.983 に答える
0

あなたは試すことができます:

    a,b,c = (to_split("/",2) + [None]*3)[0:3]

ただし、@DSM には同意します。最も Pythonic な方法が、問題を解決するための最善の方法であるとは限りません。最初は問題ないかもしれませんが、読みやすさという点では、より冗長なコードが最適です。

それが私が Python を好きな理由の 1 つです。問題を解決するにはいくつかの方法があり、開発者は自分のニーズに応じて最適なものを選択する必要があります。

于 2013-10-06T18:30:02.547 に答える