如何检查传入名称的单词是否存在于对象艺人名称中?
解决方案
你的问题出在原代码的匹配逻辑上:name in self._artist是判断整个传入的name字符串是否是艺人名称的子串,但需求是至少有一个单词匹配,所以需要改成基于单词集合的交集检查。
修正后的完整代码
class Song: def __init__(self, artist, title): self._artist = artist self._title = title def check_artist(self, name): # 将艺人名称和传入的名称都拆分为单词集合 artist_words = set(self._artist.split()) name_words = set(name.split()) # 检查两个集合是否有交集(即存在共同单词) return bool(artist_words & name_words) song1 = Song("Lady Gaga and Bradley Cooper", "Shallow") print("Testing check_artist with 'Lady Gaga and Bradley Cooper'") # True assert(song1.check_artist("Lady Gaga and Bradley Cooper")) print("Testing check_artist with 'Lord Gaga'") # True,艺人名称中存在其中一个单词 assert(song1.check_artist("Lord Gaga"))
逻辑说明
- 使用
split()方法将字符串按空格拆分为单词列表,再转成集合(集合的交集操作效率更高)。 - 通过
&运算符计算两个集合的交集,若交集不为空则说明存在匹配的单词,返回True,否则返回False。
可选优化:大小写不敏感匹配
如果需要忽略大小写(比如传入"gaga"也能匹配成功),可以在拆分后统一转成小写:
def check_artist(self, name): artist_words = set(word.lower() for word in self._artist.split()) name_words = set(word.lower() for word in name.split()) return bool(artist_words & name_words)
内容的提问来源于stack exchange,提问作者ali03
相关产品推荐
相关产品推荐

