我看过一个在线课程,它们有如下例子:
from itertools import count
# creates a count iterator object
iterator =(count(start = 0, step = 2))
# prints an even list of integers
print("Even list:",
list(next(iterator) for _ in range(5)))..。您可以使用range或np.arange编写。下面是另一个例子:
# list containing some strings
my_list =["x", "y", "z"]
# count spits out integers for
# each value in my list
for i in zip(count(start = 1, step = 1), my_list):
print(i)..。这基本上就是enumerate。所以我的问题是:你能给出一个itertools.count和itertools.islice的例子吗?它不能用range做(或者必须做得更笨重)。
发布于 2022-02-06 13:26:18
这里有一种情况,即count实例是偶尔使用的,而不是在单个循环中立即使用。
class Foo:
_x = count() # Infinite supply of unique integer values
def __init__(self):
self._id = f'Foo #{next(self._x)}'下面是使用islice防止O(n)内存使用的情况:
def is_sorted(some_list):
return all(i <= j for i, j in zip(some_list, islice(some_list, 1, None)))如果你把它写成
def is_sorted(some_list):
return all(i <= j for i, j in zip(some_list, some_list[1:]))在对第一对some_list进行测试之前,您将不得不制作几乎完整的[2, 1] + [3] * 10000副本,这对[2, 1] + [3] * 10000这样的大列表来说是一种巨大的浪费。
任何一个都不是必要的,因为每一个都是微不足道的定义:
def count(start=0, step=1):
while True:
yield start
start += step
# A more accurate translation would be more complicated than necessary for our purposes here.
# The real version would have to be able to handle stop=None
# and choose 1 and -1 as default values for step, depending
# on whether stop is less than or greater than start.
def islice(itr, start, stop, step):
for _ in range(start):
next(itr)
while start < stop:
yield next(itr)
start += stephttps://stackoverflow.com/questions/71006606
复制相似问题