python 从一行的列表中打印所有单词

-1 投票
3 回答
707 浏览
提问于 2025-04-18 16:44

我正在尝试编写代码,从一个列表中打印出所有的关键词。我的意思是,我有一个列表 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 个回答

1

你每次都在用新的关键字给变量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)

你也可以看看是否可以用列表推导式在一行代码中构建这个数组。我还没试过,但可能是可以做到的。祝你好运!

1

如果你不在意顺序的话,可以把你的 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
1

你这里有两个问题,都需要解决。

首先,正如@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

等等。无论你想添加什么,你都需要先思考一下规则是什么,然后才能把它变成代码,但通常这不会很难。

撰写回答