如何为这些if语句创建循环?

时间:2017-01-30 09:16:15

标签: python python-3.x

这是我在没有循环的情况下取得的成就,这很难看。我确信这可以通过循环来完成而不需要重复的语句:

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再次如此真实,继续这样做直到下一个没有数字。

如何通过循环实现这一目标?

3 个答案:

答案 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'等,直到StopIterationnext()引发打电话。

演示:

>>> 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)