Skip to content
Advertisement

The method doesn’t want to enter in for loo

def getAvg(channel_id):
    videos = v_db.find({'channelId':channel_id})
    if len(list(videos)) > 1:
        total_days=0
        first = True
        print('here-1')
        for video in list(videos):
            data = video['publishedAt']
            print('here-2')
            if first:
                old_date = formatDate(data)
                first = False
                continue
            else:
                current_date = formatDate(data)
                days = abs((old_date - current_date).days)
            old_date = current_date
            total_days += int(days)
        avg = total_days / len(list(videos))
        avg = round(avg, 0)
    else:
        avg = None
    return avg

What’s the problem with this damn loop? I don’t understand why the method doesn’t acces the loop. I tried to make videos a list because cursor type can’t be parsed. If I’m running this for loop alone, without the if statement above, it works.

videos = v_db.find({'channelId':'UC8PQ5xjJNp6wgpF9GXmlkvw'})
for video in list(videos):
    print('here-2')

Advertisement

Answer

videos is an iterable, and you can only iterate over it once. You exhaust it when you do if len(list(videos)) > 1:, so there’s nothing left when you try to do for video in list(videos):.

The solution is to put the list in a variable.

def getAvg(channel_id):
    videos = list(v_db.find({'channelId':channel_id}))
    if len(videos) > 0:
        total_days=0
        first = True
        print('here-1')
        for video in videos:
            data = video['publishedAt']
            print('here-2')
            if first:
                old_date = formatDate(data)
                first = False
                continue
            else:
                current_date = formatDate(data)
                days = abs((old_date - current_date).days)
            old_date = current_date
            total_days += int(days)
        avg = total_days / len(videos)
        avg = round(avg, 0)
    else:
        avg = None
    return avg

Also, you should test len > 0. There’s no problem with calculating the average of 1 video.

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement