代码之家  ›  专栏  ›  技术社区  ›  Dicky Raambo

删除datalist Python 2.7/Django中的重复项

  •  1
  • Dicky Raambo  · 技术社区  · 6 年前

    例如,我有一个名为 attendances 包含多个数据,如:

    [ <Attendance>: 11804 : 2018-07-18 12:22:55, <Attendance>: 11804 : 2018-07-18 12:23:04, <Attendance>: 2 : 2018-07-25 16:17:18, <Attendance>: 2 : 2018-07-25 16:17:20, <Attendance>: 2 : 2018-07-25 16:17:23, <Attendance>: 2 : 2018-07-25 16:27:52]

    当我需要打印的时候。我只是:

    for data in attendances:
        print 'User ID   : {}'.format(data.user_id)
        print 'Timestamp : {}'.format(data.timestamp) 
    

    结果将是:

    User ID   : 11804
    Timestamp : 2018-07-18 12:22:55
    User ID   : 11804
    Timestamp : 2018-07-18 12:23:04
    User ID   : 2
    Timestamp : 2018-07-25 16:17:18
    User ID   : 2
    Timestamp : 2018-07-25 16:17:20
    User ID   : 2
    Timestamp : 2018-07-25 16:17:23
    User ID   : 2
    Timestamp : 2018-07-25 16:27:52
    

    但这不是我需要的,因为它打印了所有的数据。我只需要每 User ID .

    这样地:

    User ID   : 11804
    Timestamp : 2018-07-18 12:22:55
    User ID   : 2
    Timestamp : 2018-07-25 16:17:18
    

    你知道我该怎么做吗?...

    1 回复  |  直到 6 年前
        1
  •  2
  •   willeM_ Van Onsem    6 年前

    带着疑问

    您可以进行查询以获取 QuerySet 包含字典。在这种情况下,每本字典都包含一个 'user_id' 钥匙,和 'first_timestamp' 钥匙,比如:

    from django.db.models import Min
    
    data =Attendance.objects.values('user_id').annotate(
        first_timestamp=Min('timestamp')
    ).order_by('user_id')

    然后可以枚举结果,并按如下方式打印:

    for data in attendances:
        print 'User ID   : {}'.format(data['user_id'])
        print 'Timestamp : {}'.format(data['timestamp']) 
    

    用一个 set 保持 已经看到了 用户

    如果不可能编写这样的查询(例如,给了您一个列表)。我们可以先执行排序,然后维护一组已经看到的用户ID:

    from operator import attrgetter
    
    sorted_attendances = sorted(attendances, key=attrgetter('timestamp'))
    seen_users = set()
    
    for attendance in sorted_attendances:
        if attendance.user_id not in seen_users:
            seen_users.add(attendance.user_id)
            print 'User ID   : {}'.format(data.user_id)
            print 'Timestamp : {}'.format(data.timestamp)

    然而,这种方法通常更昂贵,因为数据库传输的数据量更大,因此要处理的数据量也更大。