是否有更多的Pythonic方法来编写下面的代码,以便它迭代某些条件但是还保留了迭代的索引?
def TrieMatching(text, trie):
match_locations = []
location = 0
while text:
if PrefixTrieMatching(text, trie):
match_locations.append(location)
text = text[1:]
location += 1
答案 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():
...