这是我在没有循环的情况下取得的成就,这很难看。我确信这可以通过循环来完成而不需要重复的语句:
def my_function(my_list_of_words):
_digits = re.compile('\d')
to_return = []
for i, p in enumerate(my_list_of_words):
new_list= []
if 'start' in p:
if bool(_digits.search(my_list_of_words[i+1])):
new_list.append(p)
new_list.append(my_list_of_words[i+1])
if bool(_digits.search(my_list_of_words[i+2])):
new_list.append(my_list_of_words[i+2])
if bool(_digits.search(my_list_of_words[i+3])):
new_list.append(my_list_of_words[i+3])
to_return.append(" ".join(new_list))
return to_return
这很好用,但我不知道在"start"
之后会有多少个带数字的字符串。
我想要一个循环,它将继续在字符串列表中查找数字,直到下一个索引没有数字。
我试过了:
def my_function(my_list_of_words):
_digits = re.compile('\d')
to_return = []
for i, p in enumerate(my_list_of_words):
new_list= []
count = 1
if 'start' in p:
new_list.append(p)
while bool(_digits.search(my_list_of_words[i+count])):
new_list.append(my_list_of_words[i+count])
++count
to_return.append(" ".join(new_list))
return to_return
由于某些原因这不起作用,它似乎永远循环。我也尝试过:
while True:
if bool(_digits.search(my_list_of_words[i+count])):
//doo things
++count
else:
break
这对我来说也不起作用,它永远循环。
代表我正在努力实现的目标:
['foo','foo','foo','start', '23', 'a32bc', '43', '332', 'foo', 'start', '23', 'a32bc']
会产生
['start 23 a32bc 43 332', 'start 23 a32bc']
假设我们有上面的列表,当我们到达'start'
时,我想检查下一个是否有号码,在我们的情况下23
,如果是,则检查下一个号码(包含32
再次如此真实,继续这样做直到下一个没有数字。
如何通过循环实现这一目标?
答案 0 :(得分:3)
while True: count++
循环的Pythonic版本是iterator,与next()
function结合以前进到下一个元素。当迭代器耗尽时,会引发StopIteration
exception。
为列表创建一个迭代器(使用iter()
function,然后在匹配时使用嵌套循环来推进迭代器:
def my_function(my_list_of_words, _digits=re.compile('\d').search):
word_iter = iter(my_list_of_words)
digit_words = None
results = []
try:
curr = next(word_iter)
while True:
# scan to the next 'start' value
while 'start' not in curr:
curr = next(word_iter)
# collect digits; curr == start so we advance to the next
digit_words = [curr]
while True:
curr = next(word_iter)
if not _digits(curr):
break
digit_words.append(curr)
results.append(' '.join(digit_words))
digit_words = []
except StopIteration:
# out of words, append remaining digit_words if there are any.
if digit_words:
results.append(' '.join(digit_words))
return results
所以这会跳过元素,直到找到'start'
,然后收集有数字的条目,然后切换回查找'start'
等,直到StopIteration
被next()
引发打电话。
演示:
>>> my_function(['foo','foo','foo','start', '23', 'a32bc', '43', '332', 'foo', 'start', '23', 'a32bc'])
['start 23 a32bc 43 332', 'start 23 a32bc']
您可以使用results.append()
替换所有yield
来电,使其成为生成器。
请注意,我假设不会有任何重叠的序列;例如'start'
永远不会出现在连续数字部分中带有数字的单词中。
答案 1 :(得分:1)
import re
def my_function(my_list_of_words):
_digits = re.compile('\d')
to_return = []
for i, p in enumerate(my_list_of_words):
new_list= []
if 'start' in p and i+1 < len(my_list_of_words):
if bool(_digits.search(my_list_of_words[i+1])):
new_list.append(p)
for j in xrange(1,len(my_list_of_words)-i):
if bool(_digits.search(my_list_of_words[i+j])):
new_list.append(my_list_of_words[i+j])
else:
break
to_return.append(" ".join(new_list))
return to_return
print my_function(['foo','foo','foo','start', '23', 'a32bc', '43', '332', 'foo', "donotmatch66", 'start', '23', 'a32bc', 'start'])
将返回
['start 23 a32bc 43 332', 'start 23 a32bc']
答案 2 :(得分:0)
这里是一个简单的程序,用于在python中查找素数,该{@ 1}} for loop
条件下的if
:
def getPrime(X):
print("The entered number is ",str(X))
x=int(X)
if x==1:
print("1 is treated as speacial charater")
return False
for i in range(2,x):
if x%i==0:
print("{} is eual to {}x{}".format(x,i,x//i))
return False
else:
print(x, "is a Prime Number")
return True
print("Please enter number greater than 1 ")
M =input()
m=int(M)
for i in range(2,m):
getPrime(i)