删除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)