Как сравнить списки по количеству элементов в них?
Дан список чисел 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 шт):
Просто команда сравнения попала в цикл, а в нём в 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)
Просто хочется объяснить, что там проиходит:
- "2 * (i % 2) - 1" возвращает 1 для нечётных и -1 для чётных.
- map сопоставляет исходному массиву массив (1).
- sum это всё суммирует, суммирует...
- И если положительных единичек больше, чем отрицательных, то сумма больше нуля!
Вау!
Чисто из любви к искусству. Суммируем количество нечетных и делим на длину исходного списка, сравниваем результат с 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)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(sum(x & 1 for x in a) > len(a) >> 1)