Элементы которые встречаются в списке нечетное число раз. Python

Рейтинг: 0Ответов: 2Опубликовано: 01.03.2023
def odd_elements(arr: list) -> list:
    odd_list = []
    odd_list = [r for r in arr if arr.count(r) % 2 != 0]
    print(odd_list)
    return odd_list
odd_elements([1, 2, 3, 2, 4, 5, 5, 6, 6, 6])
assert result1 == [1, 3, 4, 6]

на выходе получается [1, 3, 4, 6, 6, 6] помогите пожалуйста, в чем причина

Ответы

▲ 0Принят

Причина в том что каждое значение обрабатывается столько раз, сколько встречается. Поправить можно удалив дубли:

    ...
    return list(set(odd_list))

У задачи есть более производительное решение. odds - множество значений, которые встретились нечётное число раз. Первоначально оно пусто. Значения массива перебираются. Если значения нет в множестве, оно туда добавляется, иначе удаляется. В конце множество возвращается в виде массива. На больших массивах это решение одно из самых быстрых:

def odd_elements(arr: list) -> list:
    odds = set()
    for v in arr:
        if v in odds:
            odds.remove(v)
        else:
            odds.add(v)
    return list(odds)
▲ 2

Дело в том, что в списковом включении каждое число из списка обрабатывалось столько раз, сколько встретилось (например, 6 встречается 3 раза). Можно сначала сделать из списка множество, убрав повторения элементов, затем итерировать по нему.

def odd_elements(arr: list) -> list:
    odd_list = [r for r in set(arr) if arr.count(r) % 2 != 0]
    print(odd_list)
    return odd_list
result1 = odd_elements([1, 2, 3, 2, 4, 5, 5, 6, 6, 6])
assert result1 == [1, 3, 4, 6]
[1, 3, 4, 6]