Python генераторная функция до l oop по итерируемой последовательности, исключая дубликаты - PullRequest
0 голосов
/ 01 мая 2020

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

Я хотел бы, чтобы вывод был примерно таким:

>>> next(i)
2
>>> next(i)
8
>>> next(i)
4....

Я смог написать его как обычная функция, которая создает список:

def unique(series):
    new_series = []
    for i in series:
        if i not in new_series:
            new_series.append(i)
    return new_series

series = ([2,8,4,5,5,6,6,6,2,1])
print(unique(series))

Затем я попытался переписать его как функцию генератора, исключив строки, которые создают пустой список и которые добавляются в этот список, а затем вместо этого использовал «yield» «возврата»; но я не заставляю его работать:

def unique(series):
    for i in series:
        if i not in new_series:
            yield new_series

Я не знаю, оставляю ли я что-то или вкладываю слишком много. Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Попробуйте это:

def unique(series):
    new_se = []

    for i in series:
        if i not in new_se:
            new_se.append(i)
            new_se = list(dict.fromkeys(new_se)) # this will remove duplicates
    return new_se

series = [2,8,4,5,5,6,6,6,2,1]
print(unique(series))
0 голосов
/ 01 мая 2020

Ну, проще говоря, вам нужно что-то, чтобы «запомнить» найденные вами значения. В первой функции вы использовали сам новый список, но во второй у вас его нет, поэтому он не работает. Для этой цели вы можете использовать set().

def unique(series):
    seen = set()

    for i in series:
        if i not in seen:
            seen.add(i)
            yield i

Кроме того, yield должен "давать" одно значение сразу, а не весь новый список.

Для распечатки элементы, вам придется перебирать генератор. Простое выполнение print(unique([1, 2, 3])) напечатает полученный объект генератора.

>>> print(unique([1, 1, 2, 3]))
<generator object unique at 0x1023bda98>

>>> print(*unique([1, 1, 2, 3]))
1 2 3

>>> for x in unique([1, 1, 2, 3]):
    print(x)
1
2
3

Примечание: * во втором примере это оператор повторяемая распаковка .

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