Как написать функцию «генератор», которая производит элементы из следующего списка.List = [1,3,4, "hello", 5, 3,4, "create"] - PullRequest
0 голосов
/ 10 сентября 2018

а) Я хочу создать функцию генератора, которая производит элементы списка = [1,3,4, «привет», 5,3,4, «создать»].

б)Затем я хочу создать новый список, в котором этот список отсортирован только по уникальным элементам с использованием той же созданной функции генератора.

Работает ли это для а) или это отрицает цель использования генератора из-за цикла for?

def generate(list):
    for i in list:
        yield(i)

produce = generator(list)

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

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

Список уже итерируем по своим элементам.Вы можете сделать for elem in lst: точно так же, как и for elem in generate(lst):, и на самом деле это будет немного более эффективно.


Иногда вам особенно нужен итератор - итератор, который отслеживает еготекущая позиция, чтобы вы могли позвонить next по ней.Например, если вы хотите сгруппировать итерируемое в кортежи по 2 значениям, самый простой способ сделать это - использовать итератор над итерируемым.

Но встроенная функция iter уже делает это - вы можете использовать iter(lst) так же, как и generate(lst), и снова, это будет немного более эффективно.


Редко вам нужен генератор - итератор, который предоставляет несколько дополнительных методов.Я не уверен, почему вам когда-нибудь понадобится тот, который просто перебирает список, потому что у него нет ничего полезного для do с этими дополнительными методами, но, возможно, кто-то написал какую-то глупую функцию, которая проверяет isinstance(g, types.GeneratorType) и отказывается работать со списком или итератором списка, и вы не можете изменить эту функцию.

Но даже в этом случае вы можете просто написать выражение генератора, (i for i in lst) вместо generate(lst).


Наконец, вам может понадобиться не просто генератор, а функция, которая возвращает генератор.Может быть, вам нужно передать его как обратный вызов, который будет вызван позже;Я не знаю.

В таком случае то, что вы написали, имеет смысл.Однако, если вы не используете Python 2.7 или 3.2 или более раннюю версию, вы, вероятно, все еще хотите использовать yield from:

def generate(lst):
    yield from lst

Затем я хочу создать новый список, которыйсписок отсортирован только с уникальными элементами с использованием той же созданной функции генератора.

Нет смысла использовать функцию генератора здесь, когда все, что вам нужно, это итерация, но если вам требуется чтобы использовать его для какого-то задания, нет причин, по которым вы не можете.На самом деле, это ничем не отличается от использования списка.

Если вы хотите отсортировать уникальные значения в списке, вы можете выполнить uniquify и отсортировать:

sorted_uniques = sorted(set(lst))

…или сортируйте и унифицируйте (например, используя рецепт unique_justseen в itertools документах):

sorted_uniques = list(unique_justseen(sorted(lst)))

Как вы делаете то же самое с вашим генератором?Просто передайте генератор вместо списка:

sorted_uniques = sorted(set(generate(lst)))
0 голосов
/ 10 сентября 2018

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

def generate():
    _list = [1, 3, 4, "hello", 5, 3, 4, "create"]
    for obj in _list:
        yield(obj)

Чтобы быстро избавиться от дубликатов, вы можете привести возвращаемый список (или генератор) кset:

x = set(generate())

Чтобы отсортировать его, просто приведите его обратно в список и отсортируйте его:

y = sorted(list(x))
...