我正在尝试遍历搜索列表,我已经像在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
答案 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中所指出的,您可以通过将strings
或line
转换为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(' ')