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)
绝大多数时候,你所关心的只有一个可迭代的东西,你可以在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)))
您拥有的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))