从匹配索引开始循环迭代列表多次

时间:2014-12-21 19:57:15

标签: python list iterator cycle slice

我需要在python中执行以下操作。我有一个字符串列表list,要搜索的字符串text和包含要打印的元素数量的变量x。我想迭代x没有。如果需要,list的连续元素包围list的前面。

首先,我需要在list中找到text作为子字符串的第一个元素。然后,我将在匹配元素的之后的list 的第一个元素开始,并继续迭代x的{​​{1}}个连续元素,包裹如果有必要的话。

我该怎么做?

list

在这个例子中,我想最终看看以下11个元素:

x = 11
text = "string5"
list = ["string1", "string2", "string3", "string4", "string5", "string6", "string7"]

# not sure what to do here...
for elem in list:
    if text in elem:
        #iterate through list, begin with elem and get the next 11 elements
        #once you've reached string7, start over with string1`

5 个答案:

答案 0 :(得分:8)

您可以使用cycle from itertools,也可以与isliceenumerate结合使用。

from itertools import cycle, islice

x = 11
text = "string5"
lst = ["string1", "string2", "string3", "string4", "string5", "string6", "string7"]
for i, elem in enumerate(lst):
    if text in elem:
        next11 = list(islice(cycle(lst), i+1, i+1+x))
        print(next11)
        print(len(next11))

输出:

['string6', 'string7', 'string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7', 'string1', 'string2']
11

答案 1 :(得分:1)

希望这会有所帮助

>>> x = 11
>>> text = "string5"
>>> list = ["string1", "string2", "string3", "string4", "string5", "string6", "string7"]

>>> for i in range(len(list)):
        if text in list[i]:
            a=i+1;
            break;

>>> L = [list[i%len(list)] for i in range(a, a+x)]

>>> L
['string6', 'string7', 'string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7',     'string1', 'string2']

答案 2 :(得分:1)

没有得到它,所以这是一个美丽的解决方案..:P

>>> x = 11
>>> text = "string5"
>>> list = ["string1", "string2", "string3", "string4", "string5", "string6", "string7"]
>>> offset = list.index(text)
>>> list_len = len(list)
>>> for i in range(x):
>>>     print(list[(i+offset)%list_len])

它假定列表中的每个字符串都是唯一的,否则您只需设置偏移量。

答案 3 :(得分:1)

对于我们的问题数据:

x = 11 #no. of elements to get
text = 'string5' #text to search in elements of list
lst = ['string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7'] 
n = len(lst) 

算法1:(周期和切片)

大多数pythonic方式是使用islice模块中的函数cycleitertools

  • 循环通过/无限重复列表(cycle功能)
  • 使用重复列表(slice函数)中的开始/停止索引切出/选择所需元素

代码:

for i, val in enumerate(lst):
    if text in val:
        desired = list( islice( cycle( lst), i+1, i+1+x))

算法2:(循环和模数索引)

更传统的方式是:

  • 循环列表x没有。在匹配的索引i+1
  • 之后开始的次数
  • 使用modulo索引
  • 遍历列表元素

代码:

for i, val in enumerate(lst):
    if text in val:
        desired = [ lst[ j%n] for j in range(i+1, i+1+x)] 

算法3 - 执行不良:(旋转和重复)

许多差/慢实施也是可能的,例如使用numpy函数,例如rolltile

  • 滚动/旋转numpy数组,以便使用匹配索引i
  • 处的元素启动它
  • 平铺/重复数组,使其长度增加到超过所需的x no。元素
  • 选择x没有。元素

代码:

def nextx(lst,i,n,x):
    ll = np.array(lst)
    rll = np.roll(ll, n-i)
    trll = np.tile(rll, x%n+1)
    return list(trll[:x])

<强>输出:

>>> nextx(lst,5,7,11)
['string6', 'string7', 'string1', 'string2', 'string3', 'string4', 'string5', 'string6', 'string7', 'string1', 'string2']
>>> nextx(lst,5,7,11) == [lst[j%len(lst)] for j in range(5,5+11)] == list(islice(cycle(lst),5,5+11))
True

<强>定时:

iPython线魔术函数%timeit表明Algorithm 1分别为~1.5 and ~11 times faster而不是惊人>>> %timeit list( islice( cycle( lst), 5, 5+11)) 100000 loops, best of 3: 1.83 µs per loop >>> %timeit [ lst[ j%len(lst)] for j in range(5, 5+11)] 100000 loops, best of 3: 2.76 µs per loop >>> %timeit nextx(lst,5,7,11) 10000 loops, best of 3: 20.6 µs per loop

itertools

<强>结论:

只要您可以使用cycleislicecountrepeat等,使用{{1}}即可获得最快和最快的方式!

答案 4 :(得分:-1)

使用while循环?

i = 0
n = 0
while 1:
  if i > len(list):
    i = 0
  if (k > x):
    break
  print(list[i])
  i += 1
  k += 1