2017-04-26 21 views
1

2つのうちどれがより最適かつ/またはよりピジョンコードであるか? 関数は、文字列2の対応する位置に同じ文字が含まれている文字列1の位置の数を返す:2つの文字列の間で同じ位置にある同じ文字を数えるためのアルゴリズム

def compare(s1, s2): 
    count = 0 
    for i in s1: 
     if i == s2[s1.index(i)]: 
      count += 1 
    print(count) 

def compare2(s1, s2): 
    count = 0 
    for i in range(0, len(s1)): 
     if s1[i] == s2[i]: 
      count += 1 
    print(count) 
+0

S1で iについて\tカウント= 0 \t: \t \tどうか== S2 [s1.index(I)]:DEF(S1、S2)を比較 何らかの理由 –

+0

[ 'ジッパー()'](https://docs.python.org/3 /library/functions.html#zip) - ['enumerate()'](https://docs.python.org/3/library/functions.html#enumerate) - ['sum()'](https:///docs.python.org/3/library/functions.html#sum) –

+1

のためのポストに質問に入った第一機能だ\t \t \t数+ = 1 \t印刷(カウント) – spectras

答えて

-2

秒1は、あなたが不必要(c1.index())関数を呼び出していないとして、より最適です。それはforループO(n)の内部O(N)インデックス()動作を有しているため厳密

+0

さらに、最初のものは*間違っています。文字が2回存在する場合、 'index()'は最初の位置だけを返すので、インデックスを使用するコードは、指定された文字の最初のインスタンス以外の2番目の文字列の正しい位置を検証しません。 –

+0

はい。私は逃しました! – rohan

1

性能の用語では、最初のが(比較)は次あります。 2番目ののcompare2()は、iのO(1)ランダムアクセスインデックスを使用するため、はるかに優れています。

つまり、@CharlesDuffyは最初に取り組む必要がある正しさの問題を指摘しました。

関数呼び出しのオーバーヘッドは重要ではありません、非常に高速に実行する必要があり、この代替案を検討し、長い文字列の場合

:Pythonの2で

>>> a = 'abcdefghijklmnopqrstuvwxyz' 
>>> b = 'a---e---i-----o-----u---y-' 
>>> sum(map(str.__eq__, a, b)) 
6 

、改善されたキャッシュ効率のために、この最適化を追加します。

>>> from itertools import imap   # iterator version of map() 
>>> sum(imap(str.__eq__, a, b)) 
6 
関連する問題