我需要在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`
答案 0 :(得分:8)
您可以使用cycle
from itertools
,也可以与islice
和enumerate
结合使用。
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
模块中的函数cycle
和itertools
:
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
函数,例如roll
,tile
:
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
<强>结论:强>
只要您可以使用cycle
,islice
,count
,repeat
等,使用{{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