在Python中使用圆形列表

普通的链表有一个根节点,每个节点都有一个指向下一个节点的指针和一段数据,除了最后一个节点,它没有下一个节点(所以持有一个Null 的值),告诉我们那是最后一个节点。然而,在一个循环链接列表中,最后一个节点有一个指向列表中第一个节点的指针。

所以,循环链接列表是链接列表的结构,使上述结构中的所有节点形成一个圆。这种线性和动态的数据结构,其节点不能None ;有最后一个节点连接到第一个节点,所以每个节点都可以通向上一个或下一个节点,如此循环往复。

通常,iterator 对象允许我们在一个列表或字典数据结构中从一个元素移动到另一个元素。在循环列表中,每个节点之间的连接允许这样做,特别是使用内置函数。

这篇文章讨论了在 Python 中实现和使用循环列表的问题,无论是原生的还是使用模块的。

使用itertools.cycle 来使用 Python 中的循环列表

Python 有一个叫做itertools 的内置模块,可以用迭代器和功能循环来实现序列。在这个模块中,迭代器(方法)有助于建立高效的系统,在不同的环境下进行循环,从短的输入序列到组合场景。

然而,更重要的是cycle() 迭代器,它是一个无限的迭代器,需要一个列表并无限地迭代它。

这是通过创建一个迭代器来实现的,该迭代器返回其元素并从可迭代的元素中复制每个元素。之后,它在迭代结束后返回保存的副本中的项目。

为了使用模块itertools 和方法cycle() ,我们利用了这个import 语句:

from itertools import cycle

从这里我们所要做的就是把一个列表传给cycle() 方法,我们就有了一个循环链接的列表。此外,我们可以使用一个内置的函数next(), 来访问并返回下一个元素或节点的迭代器,也就是循环链接列表。

from itertools import cycle
numList = ['one', 'two', 'three', 'four', 'five']
circularList = cycle(numList)
print(next(circularList))
print(next(circularList))

输出:

one
two

因此,通过next() 方法,我们可以很容易地将迭代器一个一个地推进,而不是使用for 循环,因为它永远地循环。

from itertools import cycle
numList = ['one', 'two', 'three', 'four', 'five']
circularList = cycle(numList)
for num in circularList:
    print(num)

输出结果:

one
two
three
four
five
one
two
three
four

使用generators ,在Python中使用循环列表

通过生成器,我们可以创建迭代和函数,返回一个我们可以迭代的迭代器。与使用return 语句的典型函数不同,我们在generators 中使用yield 语句。

return 语句不同,yield 语句会暂停函数,保存其所有的环境变量(或状态),并在随后的调用中携带一个。此外,一个generator 函数可以包含一个return 语句和一个以上的yield 语句。

为了创建一个循环列表,我们可以使用yield 语句来保存函数的状态,并在连续的调用中等待。

def circular(args):
    while True:
        for element in args:
            yield element
numList = ['one', 'two', 'three', 'four', 'five']
circularList = circular(numList)
print(circularList)

输出:

<generator object circular at 0x0000018AFFD39A10>

通过名为circular()generator 函数,我们可以向它传递一个可迭代的参数。它使用while True 语句永远循环,但可以暂停函数以返回当前的状态(这意味着它所处的当前元素或节点),并在另一次调用时继续。

这有助于我们创建一个循环列表。

你可以使用next() 方法来检索循环列表中的下一个元素。

def circular(args):
    while True:
        for element in args:
            yield element
numList = ['one', 'two', 'three', 'four', 'five']
circularList = circular(numList)
print(next(circularList))
print(next(circularList))

输出:

one
two

或者也可以无限地循环。

def circular(args):
    while True:
        for element in args:
            yield element
numList = ['one', 'two', 'three', 'four', 'five']
circularList = circular(numList)
for i in circularList:
    print(i)

输出结果:

one
two
three
four
five
one
two