如何编写生成以下列表元素的“生成器”函数。 List = [1,3,4,“hello”,5,3,4,“create”]

问题描述 投票:-4回答:2

a)我想创建一个生成函数,生成list = [1,3,4,“hello”,5,3,4,“create”]的元素。

b)然后,我想要创建一个新列表,该列表是使用创建的相同生成器函数仅使用唯一元素排序的列表。

这是否适用于a)或是否因为for循环而无法使用生成器?

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

produce = generator(list)
python list iterator generator
2个回答
0
投票

绝大多数时候,你所关心的只有一个可迭代的东西,你可以在for循环中使用。

列表已经是其元素的可迭代。你可以和for elem in lst:一样做for elem in generate(lst):,事实上它会更有效率。


有时候,你特别需要一个迭代器 - 一个迭代器来跟踪它的当前位置,这样你就可以在它上面调用next。例如,如果要将iterable分组为2个值的元组,最简单的方法是使用迭代器覆盖迭代器。

但内置iter功能已经做到了这一点 - 你可以使用iter(lst)generate(lst)一样,再次,它会更有效率。


很少,你特别需要一个生成器 - 一个提供一些额外方法的迭代器。我不确定为什么你需要一个只迭代一个列表,因为它没有任何有用的额外方法,但也许有人写了一些愚蠢的功能,检查isinstance(g, types.GeneratorType)并拒绝使用列表或列表迭代器,您无法更改该功能。

但即使在这种情况下,你也可以写一个生成器表达式(i for i in lst),而不是generate(lst)


最后,您可能不仅需要生成器,还需要返回生成器的函数。也许你需要将它作为回调传递给以后调用;我不知道。

在那种情况下,你所写的内容是有道理的。但是,除非您使用的是Python 2.7或3.2或更早版本,否则您可能仍希望使用yield from

def generate(lst):
    yield from lst

然后我想创建一个新列表,这个列表只使用创建的相同生成器函数,仅使用唯一元素进行排序。

没有理由在这里使用生成器函数,只需要一个可迭代的 - 但是如果你需要将它用于某些赋值,那么你就没有理由不能。事实上,它与使用列表没有任何不同。

如果要对列表中的唯一值进行排序,可以使用unquify和sort:

sorted_uniques = sorted(set(lst))

......或排序和统一(例如,使用unique_justseen文档中的itertools配方):

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

你如何用你的发电机做同样的事情?只需传递生成器而不是列表:

sorted_uniques = sorted(set(generate(lst)))

0
投票

您拥有的generate(list)功能已足以完成您问题的前半部分:只需将其传递给所需的列表即可。但是,如果您希望始终为该列表返回生成器,则可以对其进行硬编码:

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

要快速删除重复项,可以将返回列表(或生成器)强制转换为集合:

x = set(generate())

要对其进行排序,只需将其转换回列表并对其进行排序:

y = sorted(list(x))
© www.soinside.com 2019 - 2024. All rights reserved.