关于python:从某个元素开始循环浏览列表

Cycle through list starting at a certain element

假设我有一个列表:

1
l = [1, 2, 3, 4]

我想骑车穿过它。通常情况下,它会这样做,

1
1, 2, 3, 4, 1, 2, 3, 4, 1, 2...

我希望能够从循环中的某个点开始,不一定是索引,但可能是匹配元素。假设我想从列表中的任何元素开始,那么输出将是,

1
4, 1, 2, 3, 4, 1, 2, 3, 4, 1...

我怎样才能做到这一点?


看itertools模块。它提供了所有必要的功能。

1
2
3
4
5
6
7
8
9
10
from itertools import cycle, islice, dropwhile

L = [1, 2, 3, 4]

cycled = cycle(L)  # cycle thorugh the list 'L'
skipped = dropwhile(lambda x: x != 4, cycled)  # drop the values until x==4
sliced = islice(skipped, None, 10)  # take the first 10 values

result = list(sliced)  # create a list from iterator
print(result)

输出:

1
[4, 1, 2, 3, 4, 1, 2, 3, 4, 1]

mod使用算术运算符。你想从k位置,然后更新k应该是这样的:

1
k = (k + 1) % len(l)

如果你想启动或某些元素,逆境指标的外观,你可以总是在这样k = l.index(x)x是所需的项目。


我需要一个大扇的搜索模块,当你可以做所有的事情由你自己在一个几行。这里是我的解决方案:没有进口

1
2
3
4
5
def cycle(my_list, start_at=None):
    start_at = 0 if start_at is None else my_list.index(start_at)
    while True:
        yield my_list[start_at]
        start_at = (start_at + 1) % len(my_list)

这将返回到您的列表迭代器(无限循环)。去下一个元素在周期next语句:你必须使用

1
2
3
4
5
6
>>> it1 = cycle([101,102,103,104])
>>> next(it1), next(it1), next(it1), next(it1), next(it1)
(101, 102, 103, 104, 101) # and so on ...
>>> it1 = cycle([101,102,103,104], start_at=103)
>>> next(it1), next(it1), next(it1), next(it1), next(it1)
(103, 104, 101, 102, 103) # and so on ...


1
2
3
4
import itertools as it
l = [1, 2, 3, 4]
list(it.islice(it.dropwhile(lambda x: x != 4, it.cycle(l)),  10))
# returns: [4, 1, 2, 3, 4, 1, 2, 3, 4, 1]

因此,你需要的是:迭代器

1
it.dropwhile(lambda x: x != 4, it.cycle(l))


嗯,http://docs.python.org /图书馆/ itertools.html # itertools.cycle没有这样一个点火元素。

也许你刚开始第一周无论如何拖放元素,你不喜欢。


另一个选项是循环通过列表可以完成向后。例如:

1
2
3
4
5
6
7
8
# Run this once
myList = ['foo', 'bar', 'baz', 'boom']
myItem = 'baz'

# Run this repeatedly to cycle through the list
if myItem in myList:
    myItem = myList[myList.index(myItem)-1]
    print myItem