Как сравнить списки по количеству элементов в них?

Дан список чисел a. Напишите программу, которая вернет True, если в списке больше нечетных чисел, и False — во всех остальных случаях. Результат сохраните в result.

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

Дано: a = [1, 2, 3, 4, 5, 6, 7, 8, 10] выдает все время True

i = 0
even_numbers = []
odd_numbers = []


for i in a:
    if i % 2 == 0:
       even_numbers.append(i)
    else:
       odd_numbers.append(i)
       if len(odd_numbers) > len(even_numbers):
          result = True
        else:
           result = False

Ответы (3 шт):

Автор решения: rotabor

Просто команда сравнения попала в цикл, а в нём в else

i = 0
even_numbers = []
odd_numbers = []


for i in a:
    if i % 2 == 0:
       even_numbers.append(i)
    else:
       odd_numbers.append(i)
if len(odd_numbers) > len(even_numbers):
   result = True
else:
   result = False

Вообще, там дополнительные списки не нужны, нужно просто считать нечётные. Если их больше половины, тогда истина.

odd_numbers = 0
for i in a:
    if i % 2 > 0:
       odd_numbers += 1
result = odd_numbers > len(a) / 2

А по-модному можно сделать так:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(map(lambda i : i % 2 > 0, a)).count(True) > len(a) / 2)

И, наконец, перл, вершина искусства! От Станислава:

print(sum(map(lambda i: 2 * (i % 2) - 1, a)) > 0)

Просто хочется объяснить, что там проиходит:

  1. "2 * (i % 2) - 1" возвращает 1 для нечётных и -1 для чётных.
  2. map сопоставляет исходному массиву массив (1).
  3. sum это всё суммирует, суммирует...
  4. И если положительных единичек больше, чем отрицательных, то сумма больше нуля!

Вау!

→ Ссылка
Автор решения: Alexey Trukhanov

Чисто из любви к искусству. Суммируем количество нечетных и делим на длину исходного списка, сравниваем результат с 0.5. Если больше - в результате истина, если меньше или равно - ложь.

result = sum(i % 2 != 0 for i in a) / len(a) > 0.5

UPD

Согласно комментарию Stanislav Volodarsky вынужден избавится от вещественных чисел.

result = 2 * sum(i % 2 != 0 for i in a) > len(a) 

UPD 2

В результате избавился от списка (спасибо Qwertiy) и неравенства с нулем (спасибо CrazyElf). Вот так красиво:

result = 2 * sum(i % 2 for i in a) > len(a) 
→ Ссылка
Автор решения: Qwertiy

tio.run

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(sum(x & 1 for x in a) > len(a) >> 1)
→ Ссылка