python 从一行的列表中打印所有单词
我正在尝试编写代码,从一个列表中打印出所有的关键词。我的意思是,我有一个列表 keywords=['bike','car','home']
,还有一个文本文件:
every one has bike and car
i have a bike
i am trying to get a car and home
编码:
keywords=['bike','car','home']
with open('qwe.txt','r') as file:
for line in file:
for key in keywords:
if key in line:
a = key
break
else:
a = 'nil'
print a
我希望输出能打印出列表中所有的关键词,而不是只打印出一个!我期待的输出是:
bike car
bike
car home
但是现在我得到的是:
bike
bike
car
我该如何从这些行中打印出所有的关键词呢?请帮帮我!非常感谢大家的回答!
3 个回答
你每次都在用新的关键字给变量a赋值,而不是把你看到的每一个都存起来。也许你可以每次查看新的一行时,创建一个新的列表,然后把找到的单词添加进去:
keywords=['bike','car','home']
with open('qwe.txt','r') as file:
for line in file:
a = []
for key in keywords:
if key in line:
a.append(key)
if len(a) > 0:
print ' '.join(a)
你也可以看看是否可以用列表推导式在一行代码中构建这个数组。我还没试过,但可能是可以做到的。祝你好运!
如果你不在意顺序的话,可以把你的 keywords
变成一个集合,然后和 line
中的单词找交集:
keywords = set(['bike','car','home'])
with open('qwe.txt', 'r') as file:
for line in file:
print ' '.join(keywords & set(line.split())) or 'nil'
当你的行和 keywords
很大的时候,这样做会更快,因为你不需要一个一个地遍历列表。
示例
输入
every one has bike and car
i have a bike
i am trying to get a car and home
i don't have any
输出
car bike
bike
car home
nil
你这里有两个问题,都需要解决。
首先,正如@jonrsharpe提到的,你在找到第一个匹配项后就用break
停止了,这意味着你明确告诉Python在找到第一个匹配后就停下来,所以它正按照你的要求执行。只需要去掉那个break
。
其次,正如@hasan所说,即使没有break
,对于每个键,你都在用新键替换a
,或者用nil
替换。所以,每次你只会打印出home
或者nil
。你想要的是把所有匹配的键都收集起来。像这样:
matches = []
for key in keywords:
if key in line:
matches.append(key)
if matches:
print ' '.join(matches)
else:
print 'nil'
根据你的评论:
小问题,如果我有新行是'car and bike',那么它首先打印'bike car'而不是'car bike'!
想想你让Python做什么:你在遍历keywords
中的键,检查每个键是否在line
中找到。所以当然,它们被找到的顺序就是它们在keywords
中出现的顺序。
如果你想要它们按照在行中出现的顺序,而不是在keywords
中的顺序,有两个选择。
首先,你可以在line
中搜索,寻找keywords
中的匹配项,而不是在keywords
中搜索,寻找line
中的匹配项。如果你只想匹配完整的单词,并且希望重复的单词多次出现,这样做非常简单:
for word in line.split():
if word in keywords:
matches.append(word)
如果你想匹配部分单词(例如,你现有的代码在"this program is designed for scaring small children"
中找到car
,但我刚给的代码不会),你可以搜索所有子字符串,而不是所有单词:
for i in range(len(line)):
for key in keywords:
if line[i:].startswith(key):
matches.append(key)
如果你只想每个单词找到一次,你可以在添加之前检查if word not in matches
。
等等。无论你想添加什么,你都需要先思考一下规则是什么,然后才能把它变成代码,但通常这不会很难。