是否有一种pythonic方法来进行带索引的while循环?

时间:2015-07-22 21:41:56

标签: python

是否有更多的Pythonic方法来编写下面的代码,以便它迭代某些条件但是还保留了迭代的索引?

def TrieMatching(text, trie):
    match_locations = []
    location = 0
    while text:
        if PrefixTrieMatching(text, trie):
            match_locations.append(location)
        text = text[1:]
        location += 1

6 个答案:

答案 0 :(得分:5)

我总是喜欢列表理解。

def TrieMatching(text, trie):
    match_locations = [
        location
        for location in range(len(text))
        if PrefixTrieMatch(text[location:],trie)
    ]

答案 1 :(得分:4)

您总是在增加i,所以只需使用范围:

def TrieMatching(text, trie):
    match_locations = []
    for i in range(len(text)):
        if PrefixTrieMatching(text[i:], trie):
            match_locations.append(i)

答案 2 :(得分:1)

你有没有听过一句老话:“给一个人一把锤子,突然他的所有问题看起来像指甲”? while循环不是锤子。

为什么要使用while循环?如果我是正确的,您的问题可以在不引用它们的情况下说明“生成text所有后缀与给定trie匹配的位置列表”。

这可以写成列表理解:

def TrieMatching(text, trie):
   return [l for l in range(len(text)) if PrefixTrieMatching(text[l:], trie)]

我添加了一个return,因为计算一个值没有什么意义,只是为了不保留对它的引用。

答案 3 :(得分:0)

enumerate()是迭代某些东西并获得索引的好方法。它返回一个迭代,产生(计数器,值)元组

https://docs.python.org/2/library/functions.html#enumerate

来自文档:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

所以你可以很容易地在for循环中使用它:

for (i,season) in enumerate(seasons):
     print "{} {}".format(i,season)

打印:

0 Spring
1 Summer
2 Fall
3 Winer

答案 4 :(得分:0)

enumerate通常用于跟踪for循环中的索引。以下是如何使用它的示例。

for i, elem in enumerate("abc"):
    print(i, elem)

0 a
1 b
2 c

在您的示例中,您没有像上面的情况那样使用elem,因此enumerate可能不是最佳解决方案。您应该尝试使用range或坚持使用已有的while循环。

for location in range(len(text)):
    if PrefixTrieMatching(text[location:], trie):
        match_locations.append(location)

答案 5 :(得分:-1)

我不一定会使用此功能,但itertools.count()[1, 2, 3, ...]

import itertools
for i in itertools.count():
    ...