Python迭代循环

时间:2015-06-01 09:31:16

标签: python loops syntax iteration

我正在尝试遍历搜索列表,我已经像在C中那样编写了它,但我想重写这个更加pythonic。

我一直在尝试使用enumerate,但我似乎无法让它工作,它正在搜索关键字的数据行,这些关键字保存在一个名为字符串的数组中,有人可以告诉我或者请解释正确的python语法。

感谢

for line in f:
    jd = json.loads(line)
    N=0
    while N<=(len(strings)-1):
        if findWholeWord(strings[N])(line) != None:
            print (jd['user_id'], jd['text'])
            break
        N=N+1

2 个答案:

答案 0 :(得分:1)

似乎没有必要在这里使用enumerate。只需直接迭代strings

for s in strings:
    if findWholeWord(s)(line) != None:
        print (jd['user_id'], jd['text'])
        break

如果您还需要索引变量n,请使用enumerate

for n, s in enumerate(strings):
    if findWholeWord(s)(line) != None:
        # do something with n here?
        print (jd['user_id'], jd['text'])
        break

但是,自从你在第一场比赛后break,你可能也可以使用内置的any

if any(findWholeWord(s)(line) != None for s in strings):
    jd = json.loads(line)
    print (jd['user_id'], jd['text'])

此外,正如@Ben's answer中所指出的,您可以通过将stringsline转换为set字词来提高支票的效果,然后只需使用in运算符检查一组中的某个单词是否在另一个单词中。但是,如果不知道findWholeWord到底在做什么,这很难说清楚。

答案 1 :(得分:1)

使字符串成为集合而不是数组(为了提高性能,不会改变功能)

strings = set(strings)

我不知道findWholeWord(strings [N])(line)的意图。但我猜它是这样的:

jd = json.loads(s)
## json.loads needs to be used instead json.load since 's' will be a STRING

if any(w in strings for w in tokenize(line)):
    print (jd['user_id'], jd['text'])

我猜测findWholeWords从行中获取整个单词并根据您的字符串集检查它们。如果是这样,您可以使用正确的标记器(查看NLTK)或只使用:

def tokenize(line):
  return line.split(' ')