2016-04-07 9 views
0

私は、リストの最大整数と、最高の数字と2番目に高い数字の間のマージンを見つけるプログラムを作ろうとしています。私はそれがこれらのタプル値を返したい:リストの最大マージン

>>>max_margin([5,6,4,3]) 
    (6, 1) 

    >>>max_margin([8, -2, 8, -3]) 
    (8, 0) 

    >>>maxmargin([2]) 
    (2, None) 

    >>>maxmargin([]) 
    (None, None) 

私はこれを達成するコードを作ってきたが、それはそれについて移動する最良の方法はありません。ここにあります:

def max_margin(int_list): 

     if not int_list: 
      return None, None 

     else: 
      maxnum = nextval = int_list[0] 
      bymargin = None 

      for i in intlist: 

       if i > nextval: 
        nextval = i 

       if i > maxnum: 
        tmp = nextval 
        nextval = maxnum 
        maxnum = tmp 

        bymargin = maxnum - nextval 

       if maxnum == i and nextval == i: 
        maxnum = i 
        nextval = i 
        bymargin = maxnum - nextval 

       if len(int_list) <= 1: 
        maxnum = maxnum 
        bymargin = None 

     return maxnum, bymargin 

これを書き込む方がいいですか?

+1

それはあなたが最初の 'else'を削除するため、インデントレベル –

+0

に属しているので、私は、オフトピックとして、この質問を閉じるために投票していますトピックをオフトピックとしてマークしますか?それは最も一般的なサイトを5つだけマイグレーションすることを許可しているようですので、何が最善のものかはっきりしませんでした(私は同意します、これはcodereviewにあるべきです)。 – ForceBru

+0

が任意のアイデアどのように実際にを@VincentSavard保存することができますCodeReview.stackexchange.com – dwanderson

答えて

0

あなたは次のように行うことができますこれは、int_list2に何が起こるか気にしない場合、int_list2は必要ありません。

def max_margin(int_list): 
    if len(int_list)==0: 
     return None,None 
    if len(int_list)==1: 
     return int_list[0],None 
    max_val = max(int_list) 
    int_list2 = list(int_list) 
    int_list2.remove(max_val) 
    max_val2 = max(int_list2) 
    return max_val,max_val-max_val2 
+0

ありがとう、それはそれを行うより良い方法です。うん、私はコードを簡潔に保つのに問題があるようですが、うまくいけば私はこのことから学ぶことができます。 – RoadRunner

1

リストを簡単に並べ替えることができます。

In [1]: def max_margin(int_list): 
    ...:  args = sorted(int_list) 
    ...:  try: 
    ...:   return (args[-1], args[-1] - args[-2]) 
    ...:  except IndexError: 
    ...:   try: 
    ...:    return (args[-1], None) 
    ...:   except IndexError: 
    ...:    return (None, None) 
    ...:   

In [2]: maxmargin([5,6,4,3]) 
Out[2]: (6, 1) 

In [3]: maxmargin([8, -2, 8, -3]) 
Out[3]: (8, 0) 

In [5]: maxmargin([2]) 
Out[5]: (2, None) 

In [6]: maxmargin([]) 
Out[6]: (None, None) 
+0

申し訳ありませんが、入力がリストであることに言及するのを忘れました。 – RoadRunner

1

解決策は単にリストを並べ替えるだけでよい。エルス

def maxmargin(my_list): 
    largest, secondlargest = sorted(my_list,reverse=True)[:2] 
    return largest, largest - secondlargest 

ランタイムが非常に重要である場合には、(第二位のためのインスピレーションのためのクレジットthis solutionに)のようなので、、一回だけ繰り返すことによってO(N)ソリューションを持っている可能性が

def max_margin(my_list): 
    count = 0 
    largest = second_largest = float('-inf') 
    for x in my_list: 
     count += 1 
     if x > second_largest: 
      if x >= largest: 
       largest, second_largest = x, largest 
      else: 
       second_largest = x 
    return largest, largest - second_largest if count >= 2 else None 
+0

クイックアンサーのありがとうございました:)これはとても面白い方法です。 – RoadRunner

関連する問題