@EvgenySE
СПб. Начал изучать python)

Почему не работает поиск уникального числа в списке?

Задача найти уникальное число в списке.
К примеру:
find_uniq([ 1, 1, 1, 2, 1, 1 ]) == 2

Изначально, я написал следующий код:
def find_uniq(arr):
    x = sorted(arr)
    if x[0] == x[1]:
        return x[-1]
    elif x[0] > x[1]:
        return x[0]
    else:
        return []


Но он подходит для целых положительных чисел. Если они отрицательные или как положительные так и отрицательные, то метод сравнения не подходит.

Потом я написал следующий код:
arr = [-1, -2, -1, -1]
for i in range(arr[0], arr[-1]):
    while i[0] == i[-1]: # я перебираю крайние значения списка с помощью цикла</i>
        arr.remove([0]) # если они равны, то я сокращаю его на проверенные уже крайние значения</i>
        arr.remove([-1])
        if i[0] != i[-1]: # если нахожу несоответствия, то значит одно из двух чисел уникальное.</i>
            break
            print(i[0], i[-1])
        else:
            continue


Но цикл не выводит эти числа. Пожалуйста, укажите на ошибку. Я понимаю, что возможно, есть очень простое решение поставленной задачи и я обязательно его рассмотрю. Но сейчас я учусь и хочу через данную задачу еще лучше разобраться с циклами. Поэтому прошу, если это будет возможно, не исправлять метод решения и помочь исправить данный код. Спасибо!
  • Вопрос задан
  • 169 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Пропускаешь свой список через Collections.Counter, получишь число вхождений каждого элемента.
Потом ищешь элементы, у которых число вхождений равно 1.

А если хочешь именно циклом, то можно так:
def find_uniqs(arr):
    uniqs = set()
    srtd = sorted(arr)  # список идёт по возрастанию
    for i in range(1, len(srtd)-1):
        # если элемент не равен соседям, то он один такой в списке
        if srtd[i-1] != srtd[i] and srtd[i] != srtd[i+1]:
            uniqs.add(srtd[i])
    # обрабатываем края списка, если они есть, т.е. список из >1 элемента
    if len(srtd) > 1:
        if srtd[0] != srtd[1]:
            uniqs.add(srtd[0])
        if srtd[-1] != srtd[-2]:
            uniqs.add(srtd[-1])
    elif srtd: # у нас один элемент в списке?
        uniqs.add(srtd[0]) # ну тогда его и добавляем.
    return uniqs
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Попробуйте по-другому. Получите уникальные элементы списка посредством множества (set) и затем посредством метода .count() для списка посчитайте, сколько раз встречается каждый уникальный элемент из множества в вашем списке. Элементы, для которых .count вернёт 1, и есть уникальные.
def print_unic_elements(arr):
    [print(i) for i in set(arr) if arr.count(i) == 1]
Ответ написан
nki
@nki
bezkart.ru готовая система лояльности
Создай словарь. Ключ словаря - число, а значение - количество повторений этого числа. Перебираешь свой список, заполняешь словарь и все.
Ответ написан
Комментировать
profesor08
@profesor08
arr = [1,2,2,1,2,1,3,2,1,2,3,4]
counter = dict();

for n in arr:
    if str(n) in counter:
        counter[str(n)] = counter[str(n)] + 1
    else:
        counter[str(n)] = 1

for (key, value) in counter.items():
    if value == 1:
        print(key)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы