Элементы которые встречаются в списке нечетное число раз. Python
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] помогите пожалуйста, в чем причина
Ответы (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]
Причина в том что каждое значение обрабатывается столько раз, сколько встречается. Поправить можно удалив дубли:
...
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)