2016-11-03 5 views
2

リストがあり、「*」が最も少ない要素が見つかりました。最低カウント数のリストの要素を取得する*

mylist = ['12*3','12345**6','11234'] 

だから、この小さなテストで答えがこれは動作しますが、(私は大規模なゲノムデータで働いて遅い「11234」

です:

sorted(mylist, key = lambda x: x.count('*'))[0] 

これはあまり説得力はなく作品です:

values = map(lambda x: x.count('*'), mylist) 
print mylist[values.index(min(values))] 

は良い方法はあります私はシュワルツトランスをやろうとした ?それは分かりません。

答えて

7

あなたはkeyパラメータでminを使用することができます。

>>> mylist = ['12*3','12345**6','11234'] 
>>> min(mylist, key=lambda x: x.count('*')) 
'11234' 

keysortedと同じ方法で発注指定するために反復可能に各アイテムで呼び出される関数です。ソーティングとしてO(N Nログ)あるアプローチ上

O(N)時間複雑になります。

更新:はあなたの文字列が本当に長い場合は、あなたがループ内で*の発生を数えることができるとカウントが現在の最小値と同じであるとすぐに文字列を拒否します。 0出現した文字列が見つかった場合にも、検索を終了できます。

def find(l): 
    min_item = None 
    min_val = float('inf') 

    for x in l: 
     current = 0 
     for c in x: 
      current += (c == '*') 
      if current >= min_val: 
       break 
     else: 
      # Found new minimum, update 
      min_item = x 
      min_val = current 

     # Can't get lower than 0 
     if min_val == 0: 
      break 

    return min_item 

print(find(['12*3','11234', '12345**6', '1'])) # '11234' 
1

あなたはさらに遅いラムダ関数としてkey代わりにlambdaのための別の関数を作成することで、パフォーマンスを向上させることができます。例えばとおり

  • lambda関数の使用:1.25マイクロ秒

    mquadri$ python -m "timeit" -s "mylist = ['12*3','12345**6','11234']" "min(mylist, key=lambda x: x.count('*'))" 
    1000000 loops, best of 3: 1.25 usec per loop 
    
  • を別の関数を使用する場合:以下

    def get_asterisk_count(my_string): 
        return my_string.count('*') 
    
    mylist = ['12*3','12345**6','11234'] 
    min(mylist, key=get_asterisk_count) 
    

    timeit統計ある1.19マイクロ秒

    mquadri$ python -m "timeit" -s "mylist = ['12*3','12345**6','11234']" "def get_asterisk_count(my_string): return my_string.count('*')" "min(mylist, key=get_asterisk_count)" 
    1000000 loops, best of 3: 1.19 usec per loop 
    
+0

あなたのタイミングの違いはわかりません。確かに、「ラムダ関数が遅い」という主張を支持するには不十分であり、より寛大にはより遅い。同じスニペットを複数回実行すると、名前付き関数が先に出てくることがあります。時には 'lambda 'が先に出てくることがあります。これは私が、その違いが純粋にノイズであるか、そして/または何らかの交絡要因であると信じさせる。 AFAIKは、CPythonでは、 'lambda'関数と' def'関数の実装に実際の違いはありません。私は 'lambda'の実行が同等の名前付き関数よりも遅くなる理由は見当たりません。 –

関連する問題