0

ここにウィンクルソン!問題に悩まされたとき、私は現在Pythonを学んでいます。考えているだけでめまいがするところまで来ました:Pとにかく助けていただければ幸いです!前もって感謝します!

質問:


インターロック

パラメータと同じ長さまたは同じ長さの1文字以内の2つの文字列を受け取る関数を作成します。次に、これらの2つの文字列を取得してインターロックし、各文字列から1文字を取得して、それらをインターロックする必要があります。文字列の長さが異なる場合、結果は常に長い文字列で始まる必要があります。

私のコーディング(申し訳ありませんが、私は初心者で、あまりPythonicではありません:P):


def interlock(s1, s2):
    
    r = 0
    l1 = []
    l2 = []
    inters = ''
    
    for i in range(len(s1)):
        
            l1.append(i)
        
    for i in range(len(s2)):
              
            l2.append(i)
    
    if len(s2) == len(s1):        
        
        for i in range(len(s1)):
            inters += ''.join(s1[i])
            inters += ''.join(s2[i])                
    
    elif len(s1) < len(s2):
        
        for i in range(len(s1)):
            inters += ''.join(s2[i])
            inters += ''.join(s1[i])
            r = i
            
        inters += ''.join(s2[r])
            
    elif len(s2) < len(s1):
        
        for i in range(len(s2)):
            inters += ''.join(s1[i])
            inters += ''.join(s2[i])
            r = i
        
        inters += ''.join(s1[r])
        
    else:
        pass
    
    return inters

結果(私が受け取る結果):

___________________________________________________________________________________________

 Call                   Expected    Received    Correct

 interlock('shoe','cold')   schooled    schooled    true

 interlock('flat','etry')   feltarty    feltarty    true

 **interlock('ab','siy')    saiby           saibi           false**

 **interlock('abalone','hammer')    ahbaamlmoenre   ahbaamlmoenrn   false**

 interlock('','a')          a           a           true

___________________________________________________________________________________________

2つの太字のフィールドは、私が最も問題を抱えている場所です。最後の文字を追加しようとすると、不思議な範囲外の例外が発生します。任意のアイデア/ソリューションをいただければ幸いです。-ウィンクルソン

追伸これは私の通常の投稿よりも短いです...通常、私は私が間違っていると思うことについて(不)正確な考えを与えます、そしてそれは何度も何度も何度も引きずります....あなたはアイディア。とにかく、私はおそらく馬鹿のように私のループを壊しました。とても幸運!

ありがとう

より良いプログラマーになる方法を提案してくれた皆さん、ありがとう!一日にプログラムする時間があまりないので、たくさんの人が一日の時間を割いて何かを提案するのは素晴らしいことです。私はこのウェブサイトが大好きで、それはコミュニティです:)

4

4 に答える 4

2

おそらくこれは短縮される可能性がありますが、これはあまり多くの黒魔術を使用せず、インポートも行わないことに加えて、あまり多くのpythonicでなくても、かなりpythonicだと思います。

def interlock(s1, s2):
    if len(s1) < len(s2):
        s1, s2 = s2, s1

    s1, s2 = map(list, [s1, s2])
    for i in xrange(len(s2)):
        s1.insert((2*i+1), s2[i])
    print ''.join(s1)

今いくつかのPythonの教え:

  • s1, s2 = s2, s1これは、2つの変数を交換する非常にPython的な方法です。s1それが最長の文字列であることを確認するために使用しました。
  • map関数list()を文字列のリストにマップし、[s1, s2]それらを1文字の文字列のリストに変換するために使用されます。
  • insertシーケンスの途中、特定の位置にアイテムを挿入するために使用されるリストメソッド(文字列にはありません)です。
  • ;(2*i + 1)の他のすべてのアイテムの間に挿入する必要があるため、この部分が必要です。s1
  • ''.join()は文字列操作であり、ここでは、空の文字列、または''区切り文字または「結合要素」として「nothing」()を使用して、結果の文字リストを単一の文字列に結合するために使用されます。

お役に立てれば!

于 2012-11-19T20:21:06.813 に答える
2

itertoolsを使用してこれを行う方法を他の人が示している間(これは非常に便利な演習です)、これは、いくつかの基本的なプログラミングを学ぶのに役立つ関数の記述方法を示すことを願っています。

def interlock(s1, s2):

    r = 1
    l1 = list(s1)
    l2 = list(s2)
    inters = ''
    if len(s2) == len(s1):        
        for i in range(len(s1)):
            inters += s1[i]
            inters += s2[i]

    elif len(s1) < len(s2):
        for i in range(len(s1)):
            inters += s2[i]
            inters += s1[i]
            r = i+1
        inters += s2[r]

    elif len(s2) < len(s1):
        for i in range(len(s2)):
            inters += s1[i]
            inters += s2[i]
            r = i+1

        inters += s1[r]

    else:
        pass

    return inters


a = interlock('abalone','hammer')
print (a)
print (a[::2])
print (a[1::2])
a = interlock('hammer','abalone')
print (a)
print (a[::2])
print (a[1::2])
a = interlock('ab','siy')
print (a)

元のコードから多くの構造を意図的に保持し、完全に不要な部分(たとえば、の過度の使用str.join)のみを削除しました。

于 2012-11-19T20:21:37.450 に答える
1

データ駆動型プログラミングを行う必要があります。

s1,s2 = sorted(("foo","baxer"), key=len, reverse=True)

これで、入力の関係が固定されました。

itertoolsPythonには、これをより簡単に実現するのに役立つツールもモジュールに多数含まれています。

上記のmgilsonのコードの簡略版は次のとおりです。

def interlock(in1, in2):
    r = 1
    s1,s2 = sorted((in1,in2), key=len, reverse=True)
    inters = ''
    for i in range(len(s1)):
        inters += s2[i]
        inters += s1[i]
        r = i+1
    if r < len(s2):
        inters += s2[r]

    return inters

データを特定の不変条件に対応させるだけで、コードの3分の2が不要になることがわかります。

于 2012-11-19T20:14:10.037 に答える
1

を利用して何かを試してみてくださいitertools

def interlock(s1, s2):
    if len(s2) > len(s1):
        (s1, s2) = (s2, s1)

    return ''.join(itertools.chain(*itertools.izip_longest(s1, s2, fillvalue='')))
于 2012-11-19T20:17:14.293 に答える