如何修复Python代码以完整识别列表中的双向请求(Mutuals)
修复双向请求关系检测的Python代码
首先,咱们先理清你的问题:你的输入是9个用户的请求数据,每个用户的第一个数字是ID,后面的是他们发起请求的用户列表。你要找出所有互相发起请求的用户对,但当前代码只找到了['2','5'],漏掉了['2','8']和['4','6']这两组关系。
原代码的问题拆解
咱们一步步排查问题所在:
- 请求列表遍历范围错误:
你的每个用户数据有6个值(1个ID + 5个请求对象),但原代码里用range(1,5)遍历请求列表,这只会取索引1到4的4个请求项,漏掉了索引5的第5个请求。比如用户2的请求列表里的8正好在索引5,原代码根本没检查到它,自然找不到2和8的双向关系! - 用户遍历范围不足:
输入里有9个用户,但原代码用range(0,8)只遍历了前8个用户(索引0到7),虽然这不是你漏结果的直接原因,但会导致后续用户的关系无法被检测。 - 逻辑冗余与重复风险:
原代码嵌套多层循环后,找到匹配没有及时终止内层循环,可能重复添加同一对关系;而且没有做去重处理,可能出现[2,5]和[5,2]这样的重复结果。 - 调试代码干扰:
你添加的大量print(i,j,k,l)语句不仅干扰输出,还可能影响代码逻辑的可读性。
修正后的代码
首先咱们先正确解析输入数据(假设你还没处理好输入,这里直接帮你做了转换):
# 模拟你的输入数据并转换为二维整数列表 input_str = """1,9,11,15,20,3 2,29,22,5,21,8 3,2,30,16,27,2 4,21,17,25,6,4 5,15,2,18,6,24 6,1,18,19,29,4 7,30,17,30,18,15 8,10,2,6,26,12 9,21,30,12,29,14""" content2 = [list(map(int, line.split(','))) for line in input_str.split()] mutual_pairs = [] # 遍历所有用户对,j从i+1开始避免重复检查同一对 for i in range(len(content2)): user_a = content2[i][0] user_a_requests = content2[i][1:] # 直接取所有请求对象,不用硬编码索引范围 for j in range(i+1, len(content2)): user_b = content2[j][0] user_b_requests = content2[j][1:] # 核心逻辑:检查双向请求是否存在 if user_a in user_b_requests and user_b in user_a_requests: mutual_pairs.append((user_a, user_b)) # 输出结果 print("所有双向请求关系:") for pair in mutual_pairs: print(pair)
代码优化说明
- 输入解析更健壮:把输入字符串直接转换成二维整数列表,避免手动处理索引出错。
- 逻辑更直观:直接提取每个用户的全部请求列表,用
in操作符检查双向关系,比多层嵌套循环更清晰。 - 避免重复结果:通过
j从i+1开始遍历,确保每对用户只被检查一次,不会出现重复的反向对。 - 代码可读性提升:移除了冗余的调试打印,变量命名更贴合语义。
运行结果
执行上述代码后,你会得到正确的所有双向请求关系:
所有双向请求关系: (2, 5) (2, 8) (4, 6)
这样就完美解决了你漏结果的问题,同时代码也更易于维护。
内容的提问来源于stack exchange,提问作者Isaac Cape
相关产品推荐
相关产品推荐

