首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >循环从某个元素开始的列表

循环从某个元素开始的列表
EN

Stack Overflow用户
提问于 2012-01-20 19:30:07
回答 6查看 21.6K关注 0票数 21

假设我有一个列表:

l = [1, 2, 3, 4]

我想通过它循环。通常,它会做这样的事情,

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

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

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

我如何才能做到这一点呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-01-20 19:50:04

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

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)

输出:

[4, 1, 2, 3, 4, 1, 2, 3, 4, 1]
票数 24
EN

Stack Overflow用户

发布于 2012-01-20 19:35:46

使用算术mod运算符。假设你从位置k开始,那么k应该像这样更新:

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

如果你想从某个元素开始,而不是从索引开始,你总是可以像k = l.index(x)一样查找它,其中x是所需的项。

票数 11
EN

Stack Overflow用户

发布于 2012-01-20 21:51:01

我不是一个很喜欢导入模块的人,因为你只需要几行代码就可以完成你自己的事情。以下是我没有导入的解决方案:

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语句:

>>> 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 ...
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8940737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档