2016-08-22 5 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' во время цикла: первоначальный список, или же он меняется на один номер? – Evert

+0

Ваше решение не работает, если в списке имеется более одного выброса. Также нечетно использовать 'i% 2! = 0', так как это более явно указано как' i% 2'. Аналогично для следующего теста. См. Мой ответ для более краткого изложения. –

ответ

1

Проблема в том вы суммированием список пытаются использовать, чтобы определить, является ли список в первую очередь шансы или выравнивается. Это не работает, потому что сумма списка эвенов четная, но сумма коэффициентов будет четной или нечетной в зависимости от количества элементов в списке.

Вместо этого просто следите за последним четным и нечетным в списке и видите ли вы более одного определенного типа. И как только у вас есть два уровня или два шанса, вы можете предположить, что выброс - другой.

Кроме того, использование sum() и len() в каждом предложении IF может быть невероятно неэффективным, потому что вы делаете это несколько раз.

+0

Он работает, потому что сумма списка четных целых чисел с одним нечетным целым всегда будет нечетной, но это не относится к спискам нечетных целых чисел, которые содержат одно четное целое число. – Baraxton

+0

@braxton - Точно - он ТОЛЬКО работает для списка эвенов, а не списка коэффициентов. Я думаю, что решение Дмитрия - это то, что вы хотите. – Brad

+0

Правильно, он работает только для списков эвенов. Решение Дмитрия определенно точно для моих целей. – 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. Если первые два элемента имеют разную четность, проверьте, какой элемент неправильно основан на третьей (если второй и третья имеет одинаковую четность, первая - неправильная, в противном случае - вторая - неправильная)
  3. Если первые два элемента имеют одинаковую четность, это означает, что четность первого (и второго) элемента правильное соотношение для списка. Таким образом, элемент с разной четностью - это то, что мы ищем.
+0

Поскольку, если длина нечетного списка четная, искомое четное число не возвращается, но если длина нечетного списка нечетна, возвращается возвращаемое искомое целое число. – Baraxton

+0

@Braxton ??? Основываясь на описании проблемы, это правильный ответ.Длина списка не имеет значения. –

+0

@Baraxton вы уверены, что можете основывать свою логику на этом, но это способ много работать и беспорядочных условий. –

0

Просто альтернатива, собирающая эвенки и коэффициенты в двух списках, а затем используя меньший список.

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

Смежные вопросы