2016-09-28 32 views
1

私はPythonのリストの理解をよりよく理解しようとしています。私はコードワードでのオンラインチャレンジを、あまり面白味のない解決策で完成させました。奇数/偶数のPythonリストから偶数/奇数を削除する

挑戦されました:

  1. でも

私を返し、奇数と偶数1のリストを考えると

  • 奇数を返し、偶数と奇数1のリストを考えます(エレガントでない)解決策は次のとおりでした:

    def find_outlier(integers): 
        o = [] 
        e = [] 
        for i in integers: 
         if i % 2 == 0: 
          e.append(i) 
         else: 
          o.append(i) 
        # use sums to return int type 
        if len(o) == 1: 
         return sum(o) 
        else: 
         return sum(e) 
    

    これはうまく動作しますが、かなり有害なものですrce。 oeのようなプレースホルダリストを持つ(ほとんどの)関数を開始するのがかなり "noob-like"だと思うのは間違っていますか?

    私はこのソリューションは、より良いリストの内包を理解するための努力で、でも、リスト上の奇数リストのために動作しますが、失敗した理由をよりよく理解することが大好きだ

    def find_outlier(integers): 
        if [x for x in integers if x % 2 == 0]: 
         return [x for x in integers if x % 2 == 0] 
        elif [x for x in integers if x % 2 != 0]: 
         return [x for x in integers if x % 2 != 0] 
        else: 
         print "wtf!" 
    
    o = [1,3,4,5] 
    e = [2,4,6,7] 
    
    In[1]: find_outlier(o) 
    Out[1]: [4] 
    
    In[2]: find_outlier(e) 
    Out[2]: [2, 4, 6] 
    

    Out[2]7を返すべきです。

    ありがとうございました。

  • +0

    リスト内包表記はここでは最善の解決策ではありません。最小数の要素をチェックして、代わりにそれを解決しようとしてください(タイプが異なる場合は最初の2つの要素、3番目の要素を取得する、そうでなければ末尾に収まらないまで繰り返します)。 –

    +0

    '整数 'リストに少なくとも2つの偶数*と* 2の奇数が含まれているとどうなりますか?私はあなたが本当に 'wtf'を印刷したくないと確信しています**。意味のある価値を返すか(わからないこと:空リスト?)、例外を発生させて呼び出し元に処理させてください。 'print'ステートメントを追加することは、エラーを処理してコードをデバッグする本当の効果的な方法ではありません。 – Bakuriu

    +0

    この特定のケースでは、偶数/奇数リストには常に1つだけ奇数/偶数が存在します。 @MartijnPietersはあなたの反復提案をまだ検討しています。 – d8aninja

    答えて

    6

    最初にifであるため、試行は失敗します。です。あなたは常に少なくとも1つの要素を持つリストを持っています。奇数は奇数であり、偶数のすべてのリストをテストしました。そうでなければの1つがの偶数でリストされています。 空のリストのみがfalseになります。

    リスト内包表記はここでは最善の解決策ではありません。最小数の要素をチェックして解決してください(最初の2つの要素はタイプが異なる場合は3番目になり、それ以外の場合はテールに収まらないまで繰り返されます)

    def find_outlier(iterable): 
        it = iter(iterable) 
        first = next(it) 
        second = next(it) 
        parity = first % 2 
        if second % 2 != parity: 
         # odd one out is first or second, 3rd will tell which 
         return first if next(it) % 2 != parity else second 
        else: 
         # the odd one out is later on; iterate until we find the exception 
         return next(i for i in it if i % 2 != parity) 
    

    入力イテレータブルに3つ未満の要素があるか、または例外が見つからない場合、上記はStopIteration例外をスローします。また、複数の例外が存在する場合(2偶数に2奇数、2奇数など)は処理されません。その場合は最初の奇数値が返されます。

    +1

    私はこれを[問題のコードワース](https://www.codewars.com/kata/reviews/5567bb44bbb6cdc5d2000022/groups/57ebdcfb2d45a06f8c000485)に提出しました。 –

    +0

    あなたは 'parity'概念/命名規則を理解する良い方向に私を指摘できますか? – d8aninja

    +0

    @ D8Amonk:kataは同じ用語を使用します。それは奇数と偶数の数学的定義です。 [辞書の定義](http://www.merriam-webster.com/dictionary/parity)(意味4)を参照してください。 –

    -1

    最も効率的な答えは少し醜いものになるでしょう。

    def f(in_list): 
        g = (i for i in in_list) 
        first = next(g) 
        second = next(g) #The problem as described doesn't make sense for fewer than 3 elements. Let them handle the exceptions. 
        if first%2 == second%2: 
         a = first%2 
         for el in g: 
          if el%2 != a: 
           return el 
        else: 
         third = next(g) 
         if third%2 == first%2: 
          return second 
         else: 
          return first 
        except ValueError('Got a bad list, all evens or all odds') 
    
    +1

    '(i in in_listにある)'は 'iter(in_list)'として書かれていますので、ここでジェネレータ式を使う必要はありません。パリティ(コードに 'a')を格納して、両方のブランチに使用することができます。 –

    0

    this particular challengeのソリューション・スタックの最上部にある)この応答の欠点は何ですか?

    def find_outlier(int): 
        odds = [x for x in int if x%2!=0] 
        evens= [x for x in int if x%2==0] 
        return odds[0] if len(odds)<len(evens) else evens[0] 
    
    +0

    @MartijnPietersこれがトップ投票の解決策でした。私は私の執筆時にそれを見ていませんでしたが、私が試していたのと同じリストコンパイルロジックを使用しているように見えるので、なぜ私の仕事がうまくいかないのか混乱しています... – d8aninja

    +1

    これは、どちらが短いかを比較するために 'len()'を使います。あなたのコードでは、これらのうちの1つが空であると仮定しています。これは誤った仮定です。 –

    +1

    これは入力リストの* all *値を処理する必要があることに注意してください。 2倍。 Mineは例外が見つかるまでリストを処理するだけです。それは最初の3つの要素と同じくらい小さいかもしれません。 '[1、3、4] + list(range(5、1000000、2))'でこれを試してください。 –

    関連する問題