Получение повторяющихся элементов в списке - PullRequest
0 голосов
/ 11 января 2020

Учитывая отсортированный список, я хотел бы получить первый повторный элемент в списке, используя понимание списка. Поэтому я запустил следующую строку:

list=['1', '2', '3', 'a', 'a', 'b', 'c']
print(k for k in list if k==k+1)

Я ожидал, что получится «а». Но вместо этого я получил:

<generator object <genexpr> at 0x0021AB30>

Я довольно новичок в этом, кто-то хотел бы объяснить, почему это не работает?

Ответы [ 2 ]

1 голос
/ 11 января 2020

Вы, похоже, путаете понятие элемента списка и индекса.

Например, выражение генератора, повторяющееся по всем элементам списка xs, равное его предшественнику, будет выглядеть так:

g = (xs[k] for k in range(1, len(xs)) if xs[k] == xs[k - 1])

Поскольку вас интересует только первый такой элемент, вы можете написать

next(xs[k] for k in range(1, len(xs)) if xs[k] == xs[k - 1])

, однако вы получите исключение, если таких элементов на самом деле нет.

Как правило, совет, отдавайте предпочтение простым читаемым функциям по сравнению с умными длинными однострочниками, особенно если вы новичок в языке. Ваша задача может быть выполнена следующим образом:

def first_duplicate(xs):
    for k in range(1, len(xs)):
        if xs[k] == xs[k - 1]:
            return xs[k]

chars = ['1', '2', '3', 'a', 'a', 'b', 'c']
print(first_duplicate(chars)) # 'a'

PS Остерегайтесь использования list в качестве имени переменной - вы скрываете встроенный тип

1 голос
/ 11 января 2020

Если вам нужен только первый повторяющийся элемент в списке, вы можете использовать функцию next с выражением-генератором, которое перебирает список, сжатый с самим собой, но со смещением 1 для сравнения соседних элементов:

next(a for a, b in zip(lst, lst[1:]) if a == b)

так что с учетом lst = ['1', '2', '3', 'a', 'a', 'b', 'c'] вышеприведенное возвращает: 'a'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...