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

删除datalist Python 2.7/Django中的重复项,python,django,Python,Django,例如,我有一个名为出席人数的列表,其中包含多个数据,如: [:11804:2018-07-18 12:22:55,:11804:2018-07-18 12:23:04,:2:2018-07-25 16:17:18,:2:2018-07-25 16:17:20,:2:2018-07-25 16:17:23,:2:2018-07-25 16:27:52] 当我需要打印的时候。我只是: for data in attendances: print 'User ID : {}'.format

例如,我有一个名为
出席人数
的列表,其中包含多个数据,如:

[:11804:2018-07-18 12:22:55,:11804:2018-07-18 12:23:04,:2:2018-07-25 16:17:18,:2:2018-07-25 16:17:20,:2:2018-07-25 16:17:23,: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
但这不是我需要的,因为它会打印所有数据。我只需要在每个
用户ID
中显示一个和第一个数据

像这样:

User ID   : 11804
Timestamp : 2018-07-18 12:22:55
User ID   : 2
Timestamp : 2018-07-25 16:17:18
你知道我该怎么做吗?…

带着疑问 您可以进行查询,以获得包含词典的
QuerySet
。在这种情况下,每个字典都包含一个
'user\u id'
键和一个
'first\u timestamp'
键,如:

from django.db.models import Min

data =Attendance.objects.values('user_id').annotate(
    first_timestamp=Min('timestamp')
).order_by('user_id')
使用维护已看到用户的
集合
如果无法编写这样的查询(例如,您将获得一个列表)。我们可以先执行排序,然后维护一组已经看到的用户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)
从操作员导入属性
排序\出席人数=已排序(出席人数,键=attrgetter('timestamp'))
seen_users=set()
对于已排序的出席人数:
如果attention.user\u id不在seen\u用户中:
seed\u users.add(考勤.用户\u id)
打印“用户ID:{}”。格式(data.User\u ID)
打印'Timestamp:{}'。格式(data.Timestamp)

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

第一种方法总是最早的?您可以共享(考勤的相关部分)
模型吗?在循环外部创建一个集合,在循环内部检查集合中是否已经存在用户id,如果存在->跳过,否则继续并将用户id添加到集合中。如果您需要首先对列表进行排序(无论是用户id还是日期),请参考以下答案:@Willem Van Onsem Yes Earlime总是排在第一位。您说过
这种方法通常更昂贵,但是
,有没有让它更优化的想法?…不,就复杂性而言,这是最优的。问题是,由于Python的性质,它比Haskell /C++中的静态类型语言容易运行100到10倍,因此最好不要用Python来进行这种处理,但是例如使用数据库来完成这个操作,或者有一些C++算法的接口。(就像
numpy
pandas
一样,我认为这在pandas中可能是可行的)。
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)