如何高效筛选出受邀参加派对的团队成员?
如何高效筛选出受邀参加派对的团队成员?
嗨,这个问题问得太实用了!当团队列表有300人、受邀列表多达4000人时,原来的双重循环确实会有点吃力——毕竟O(n*m)的时间复杂度,数据量上去后计算量会直线飙升。咱们来聊聊几个更高效的解决方案:
方法一:用集合优化查找逻辑
虽然本质上还是要检查每个受邀者是否包含团队成员,但把团队列表转成集合后,查找的底层效率会更高(集合的成员检查是O(1)的常数时间)。而且如果团队里有重复名字,集合还能自动去重,避免重复检查。
代码示例:
my_team_list = ['Andy', 'Bernice', 'Charlotte', 'David', 'Evan'] invitee_list = ['Mandy (Team A)', 'Navin - Team A', 'Olive Team B', 'Peter Team C', 'Queenie (D)', 'Royston -D team', 'Steven (E team)', 'Tammy (E team)', 'Bernice (Z team)', 'Victor (A Team)', 'Wendy (Team B)', 'David (Team Z)'] # 把团队成员转成集合,提升查找效率 team_set = set(my_team_list) # 遍历受邀列表,逐个检查 for invitee in invitee_list: for member in team_set: if member in invitee: print(invitee) break # 找到匹配就跳出,避免不必要的检查
这个方法的时间复杂度还是O(m*n),但实际运行速度会比原方法快,因为集合的遍历和查找效率比列表更高,而且去重后减少了循环次数。
方法二:用正则表达式批量匹配
更高效的思路是把所有团队成员拼成一个正则匹配模式,让正则引擎一次性完成“是否包含任意团队成员”的检查——正则引擎内部做了大量优化,比手动循环检查要快得多,尤其当团队成员数量较多时优势更明显。
代码示例:
import re my_team_list = ['Andy', 'Bernice', 'Charlotte', 'David', 'Evan'] invitee_list = ['Mandy (Team A)', 'Navin - Team A', 'Olive Team B', 'Peter Team C', 'Queenie (D)', 'Royston -D team', 'Steven (E team)', 'Tammy (E team)', 'Bernice (Z team)', 'Victor (A Team)', 'Wendy (Team B)', 'David (Team Z)'] # 把团队成员拼成正则备选模式,自动转义特殊字符(避免名字里有正则符号出问题) team_pattern = re.compile('|'.join(re.escape(member) for member in my_team_list)) for invitee in invitee_list: if team_pattern.search(invitee): print(invitee)
额外优化:避免子串误匹配
如果担心出现类似“Mandy”被当成包含“Andy”的误匹配情况,可以给正则加上单词边界,确保只匹配完整的名字:
team_pattern = re.compile(r'\b(' + '|'.join(re.escape(member) for member in my_team_list) + r')\b')
这个方法的时间复杂度接近O(m)(正则匹配的时间主要取决于受邀者字符串的长度,整体比双重循环高效很多),代码也更简洁。
总结
针对你的数据规模(300 vs 4000),上面两种方法都能显著提升效率。如果追求代码简洁和最高性能,正则表达式的方案会是更好的选择;如果不想引入正则库,用集合优化的方法也能达到不错的效果。
备注:内容来源于stack exchange,提问作者ih-isj
相关产品推荐
相关产品推荐

