You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django中遍历元组列表并匹配返回对应元组值的问题

问题分析与解决方案

你的代码存在几个关键问题导致无法找到匹配项:

  1. 比较对象错误:你用UserNobats实例usernobat和元组中的元素(整数序号或CalculatedNumbers对象)直接比较,两者类型完全不同,永远不会相等。你需要使用的是usernobat.usernobat这个数值字段。
  2. 循环逻辑冗余且目标错误:内层循环遍历元组的两个元素完全没必要,你只需要检查元组的第一个元素(序号)是否匹配,然后返回对应的第二个元素(CalculatedNumbers对象)即可,而不是把序号赋值给matching_object。
  3. 缩进问题:原代码中循环内的代码缩进不正确,可能导致逻辑执行异常。

修正后的代码实现

方法一:普通循环(可读性高)

def cart_resault(request):
    carts = CalculatedNumbers.objects.filter(used=False)[:50]
    usersubmit = UserSelection.objects.get(user=request.user)

    usernobat, usernobat__created = UserNobats.objects.get_or_create(user=request.user)

    numbers_sum = sum(getattr(usersubmit, f'number_{i}', 0) for i in range(1, 11))
    usernobat.usernobat = numbers_sum
    usernobat.save()
    
    numbered_objects = [(index + 1, obj) for index, obj in enumerate(carts)]
    
    matching_object = None
    # 直接遍历每个元组的序号和对象
    for number, obj in numbered_objects:
        # 比较序号与usernobat.usernobat数值
        if number == usernobat.usernobat:
            matching_object = obj
            break

方法二:使用next()函数(更简洁)

可以用生成器表达式结合next()函数实现一行查找,找不到时返回None:

def cart_resault(request):
    carts = CalculatedNumbers.objects.filter(used=False)[:50]
    usersubmit = UserSelection.objects.get(user=request.user)

    usernobat, usernobat__created = UserNobats.objects.get_or_create(user=request.user)

    numbers_sum = sum(getattr(usersubmit, f'number_{i}', 0) for i in range(1, 11))
    usernobat.usernobat = numbers_sum
    usernobat.save()
    
    numbered_objects = [(index + 1, obj) for index, obj in enumerate(carts)]
    
    # 一行实现查找,找不到返回None
    matching_object = next((obj for number, obj in numbered_objects if number == usernobat.usernobat), None)

关键说明

  • 核心逻辑是匹配元组的第一个元素(序号)与usernobat.usernobat的数值,而不是和UserNobats实例本身比较。
  • 两种方法都能准确找到对应序号的CalculatedNumbers对象,你可以根据代码可读性需求选择。

内容的提问来源于stack exchange,提问作者Essiprog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:51:20