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] |
1 | k = (k + 1) % len(l) |
如果你想启动或某些元素,逆境指标的外观,你可以总是在这样
我需要一个大扇的搜索模块,当你可以做所有的事情由你自己在一个几行。这里是我的解决方案:没有进口
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) |
这将返回到您的列表迭代器(无限循环)。去下一个元素在周期
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 |