Python中如何实现一个匹配系统?

主要用与 h5 页面做一个匹配聊天的系统。
A 点击了匹配,显示正在匹配,进入匹配队列,B 也点击了匹配,如果队列里有人,就匹配成功。可以选择按照条件匹配,(距离,性别,爱好等)
我想的是用 python 队列,有人点击匹配就加到队列里去,然后按条件查找😂,这样一个人点击了就要不断遍历队列,而且如果人数很多就僵了。 所以来请教各位,有什么好的方法或者建议吗?非常感谢╰(´︶`)╯
Python中如何实现一个匹配系统?

7 回复

点匹配就加到不同类型的队列里去,再根据条件从不同类型队列里取人配对


要实现一个匹配系统,核心是根据特定规则将两组或多组对象进行配对。下面是一个基于评分算法的简单匹配系统示例,常用于约会应用或团队分组场景。

import itertools
from dataclasses import dataclass
from typing import List, Tuple

@dataclass
class User:
    id: int
    name: str
    interests: List[str]  # 用户兴趣标签

class MatchingSystem:
    def __init__(self):
        self.users = []
    
    def add_user(self, user: User):
        self.users.append(user)
    
    def calculate_compatibility(self, user1: User, user2: User) -> float:
        """计算两个用户的匹配度"""
        common = set(user1.interests) & set(user2.interests)
        total = set(user1.interests) | set(user2.interests)
        return len(common) / len(total) if total else 0
    
    def find_best_matches(self) -> List[Tuple[User, User, float]]:
        """为每个用户找到最佳匹配"""
        if len(self.users) < 2:
            return []
        
        # 生成所有可能的配对组合
        pairs = list(itertools.combinations(self.users, 2))
        
        # 计算每对匹配度并排序
        scored_pairs = []
        for user1, user2 in pairs:
            score = self.calculate_compatibility(user1, user2)
            scored_pairs.append((user1, user2, score))
        
        # 按匹配度降序排序
        scored_pairs.sort(key=lambda x: x[2], reverse=True)
        
        # 贪心算法选择最佳匹配(避免重复匹配)
        matched = set()
        best_matches = []
        
        for user1, user2, score in scored_pairs:
            if user1.id not in matched and user2.id not in matched:
                best_matches.append((user1, user2, score))
                matched.update([user1.id, user2.id])
        
        return best_matches

# 使用示例
if __name__ == "__main__":
    system = MatchingSystem()
    
    # 添加用户
    system.add_user(User(1, "Alice", ["编程", "电影", "音乐"]))
    system.add_user(User(2, "Bob", ["编程", "运动", "游戏"]))
    system.add_user(User(3, "Charlie", ["音乐", "艺术", "读书"]))
    system.add_user(User(4, "Diana", ["电影", "旅行", "美食"]))
    
    # 获取匹配结果
    matches = system.find_best_matches()
    
    for user1, user2, score in matches:
        print(f"{user1.name} ←→ {user2.name}: 匹配度 {score:.2%}")

这个系统的工作原理:

  1. 定义用户类,包含ID、姓名和兴趣标签
  2. 通过计算共同兴趣的比例来确定匹配度
  3. 使用组合生成所有可能的配对
  4. 采用贪心算法确保每个用户只被匹配一次

匹配系统的核心是根据业务需求设计评分算法,实际应用中可能需要考虑更多因素如地理位置、年龄、历史行为等。

简单总结:匹配系统的关键是设计合适的评分算法和匹配策略。

我觉得这种聊天的需求真的不大,就整个话题分类让用户自己选自己创建就行了,
如果想要 1 对 1 那样,用户自己限制房间人数就行了,
反正我是最烦这种匹配式聊天的,如果是游戏匹配房间还好说,
聊个天选来选去选半天还匹配不上烦不烦啊,用户要的是简单简单简单啊。。。

请问这样的话,比如 A 点击了匹配之后,就要一直循环遍历吗?

感谢,就是一个小功能,说起来有点像微信那个摇一摇那样

你可以把需要的条件 归类成 redis 的 set
然后根据进来匹配的用户属性 去 set 取交集
临时想到的

为啥要循环遍历,A 点了匹配之后如果对应类型的集合中无待匹配的人,就按类型放到对应的集合里去了,如果对应类型集合中有待匹配的人那就拿出来直接和 A 匹配成功了

回到顶部