Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 循环不同长度的查询_Python_Django_Python 3.x - Fatal编程技术网

Python 循环不同长度的查询

Python 循环不同长度的查询,python,django,python-3.x,Python,Django,Python 3.x,我使用zip同时循环两个查询的结果。然而,在某些情况下,结果的长度并不相等。在这些情况下,我希望将首先结束的查询的值设置为0。由于它是第一个查询的子集,所以始终是第一个查询的结束。具体地说,它是入住机构y['supply']和入住机构y['available']。我试图想出一个解决方案,但不知道如何将它与zip结合起来,这样我就可以同时循环查看这两个结果 def occupancy_data(area_id, description, period, agency_id): occu

我使用zip同时循环两个查询的结果。然而,在某些情况下,结果的长度并不相等。在这些情况下,我希望将首先结束的查询的值设置为0。由于它是第一个查询的子集,所以始终是第一个查询的结束。具体地说,它是
入住机构y['supply']
入住机构y['available']
。我试图想出一个解决方案,但不知道如何将它与
zip
结合起来,这样我就可以同时循环查看这两个结果

def occupancy_data(area_id, description, period, agency_id):  
    occupancy = Occupancy.objects.filter(description=description) \
        .values('start_date') \
        .annotate(supply_total=Sum('supply')) \
        .annotate(available_total=Sum('available')) \
        .order_by('start_date')

    occupancy_agency = Occupancy.objects.filter(description=description, agency_id=agency_id) \
        .values('start_date',) \
        .annotate(supply=Sum('supply')) \
        .annotate(available=Sum('available')) \
        .order_by('start_date')


    x = []
    _input = occupancy.values('start_date')
    for row in _input:
        x.append("Uge " + str(int(row['start_date'].strftime("%V"))))

    y = []
    for occupancy_y, occupancy_agency_y in zip(occupancy, occupancy_agency):
        comp_supply = (occupancy_y['supply_total'] - occupancy_agency_y['supply'])
        comp_available = (occupancy_y['available_total'] - occupancy_agency_y['available'])

        occupancy_combined = ((comp_supply - comp_available) / comp_supply)

        y.append(occupancy_combined)
    return {'x': x, 'y': y}

itertools
提供了一个函数,可以实现这一点

for occupancy_y, occupancy_agency_y in zip_longest(occupancy, occupancy_agency, fillvalue=0):
    ...
或者,也许:

for occupancy_y, occupancy_agency_y in zip_longest(occupancy, occupancy_agency, fillvalue={}):
    comp_supply = (occupancy_y['supply_total'] - occupancy_agency_y.get('supply', 0))
    comp_available = (occupancy_y['available_total'] - occupancy_agency_y.get('available', 0))

    occupancy_combined = ((comp_supply - comp_available) / comp_supply)

    y.append(occupancy_combined)

itertools
提供了一个函数,可以实现这一点

for occupancy_y, occupancy_agency_y in zip_longest(occupancy, occupancy_agency, fillvalue=0):
    ...
或者,也许:

for occupancy_y, occupancy_agency_y in zip_longest(occupancy, occupancy_agency, fillvalue={}):
    comp_supply = (occupancy_y['supply_total'] - occupancy_agency_y.get('supply', 0))
    comp_available = (occupancy_y['available_total'] - occupancy_agency_y.get('available', 0))

    occupancy_combined = ((comp_supply - comp_available) / comp_supply)

    y.append(occupancy_combined)
真棒:-)我不知道解决方案会这么简单。我喜欢Python和StackOverflow!您的第一个解决方案给了我一个“TypeError:‘int’对象不可下标”,但第二个解决方案工作得很好。谢谢真棒:-)我不知道解决方案会这么简单。我喜欢Python和StackOverflow!您的第一个解决方案给了我一个“TypeError:‘int’对象不可下标”,但第二个解决方案工作得很好。谢谢