2016-08-22 4 views
1

私は、奇数の整数のリストで偶数の整数を見つけようとしています。しかし、奇数の整数のリストの長さが偶数であれば、偶数の整数ではなくリストの最初の数を返します。どんな助けもありがとうございます。以下のコード:以下奇数/偶数のリストのパリティ外れ値を見つける

even = [2, 4, 6, 8, 10, 12, 14, 2091] #2091 is the outlier and len(x) = 8 
    odd = [1, 3, 5, 7, 9, 11, 13, 4720] #4720 is the outlier and len(x) = 8 

def find_outlier(x): 
    # Determine if list is even and length of list is odd 
    if sum(x) % 2 != 0 and len(x) % 2 != 0: 
     for x in x: 
      if x % 2 != 0: 
       return x 
    # Determine if list is even and length of list is even 
    elif sum(x) % 2 != 0 and len(x) % 2 == 0: 
     for x in x: 
      if x % 2 != 0: 
       return x 
    # Determine if list is odd and length of list is odd 
    elif sum(x) % 2 == 0 and len(x) % 2 != 0: 
     for x in x: 
      if x % 2 == 0: 
       return x 
    # Determine if list is odd and length of list is even (PROBLEM) 
    elif sum(x) % 2 == 0 and len(x) % 2 == 0: 
     for x in x: 
      if x % 2 == 0: 
       return x 

print (find_outlier(even)) 
print (find_outlier(odd)) 

ドミトリの溶液から再フォーマットの問題に対する正しい解決策です:

def find_outlier(x): 
    odd = [i for i in x if i % 2 != 0] 
    even = [i for i in x if i % 2 == 0] 
    return odd[0] if len(odd) < len(even) else even[0] 
+1

'X'におけるxの:私は実際にあることを試したことがありませんが、それは難しいようだ:どのような 'X'は、ループ中にある:元のリスト、またはありません単一の番号に変更されますか? – Evert

+0

リストに複数の外れ値がある場合、あなたの解は機能しません。また、 'i%2!= 0'を使用することは奇妙です。これは' i%2'と明記されています。次のテストと同様です。より簡潔な文の私の答えを参照してください –

答えて

1

問題は、リストは主にオッズであるかどうかを判断するためにそれを使用しようとしてリストを加算されていますまたはevens。これはうまくいかないが、リストの項目の数に基づいてオッズの合計が偶数または奇数になるため、これは機能しません。

代わりに、リスト内の最後の奇数と奇数を追跡し、複数の型を見たことがあるかどうかを確認してください。そして、あなたが2つのエヴェンスか2つのオッズを持っているとすぐに、アウトライアーがもう1つであると仮定することができます。

また、各IF節でsum()とlen()を使用すると、複数回実行しているため、非常に非効率的になります。

+0

これは、奇数整数のリストの合計が常に奇数であるために機能しますが、偶数整数を含む奇数整数のリストには当てはまりません。 – Baraxton

+0

@braxton - 正確には、それは偶然のリストではなく、evensのリストのためだけに機能します。私はドミトリーのソリューションはあなたが望むものだと思う。 – Brad

+0

正しいですが、これはevensのリストでのみ機能します。ドミトリーのソリューションは間違いなく私の目的のために正確です。 – Baraxton

2

なぜ全長が気になりますか?はるかに簡単な解決法です:

def find_outliner(a): 
    if a[0] % 2 != a[1] % 2: 
     return a[0] if a[2] % 2 == a[1] % 2 else a[1] 
    for i in a: 
     if i % 2 != a[0] % 2: 
      return i 

どのように動作しますか?

  1. 秒あれば(間違った第三に基づいている要素をチェック、最初の2つの要素が異なるパリティをお持ちの場合はそうでない場合は、問題が
  2. をあまり意味がない、リスト内に少なくとも三つの要素があるはずですし、最初の2つの要素が同じパリティを持つ場合は、最初の要素(と2番目の要素)のパリティが同じであることを意味します。リストの正しいパリティしたがって、パリティが異なるエレメントが、我々が探しているものです。
+0

奇数リストの長さが偶数の場合、目的の偶数整数は返されませんが、奇数リストの長さが奇数の場合、目的の偶数整数が返されます。 – Baraxton

+0

@Braxton ???問題の説明に基づいて、これは正解です。リストの長さは無関係です。 –

+0

@Baraxtonあなたは確かにあなたのロジックをベースにすることができますが、それは多くの作業と面倒な条件の道です –

0

2つのリストのevensとoddsを収集し、次に小さいリストを使用します。

def find_outlier(x): 
    evenodd = [], [] 
    for v in x: 
     evenodd[v & 1].append(v) 
    return min(evenodd, key=len)[0] 

デモ:

>>> for x in [2, 4, 6, 8, 10, 12, 14, 2091], [1, 3, 5, 7, 9, 11, 13, 4720]: 
     print(find_outlier(x)) 

2091 
4720 
+0

非常にクールな解決策! – Baraxton

関連する問題