2017-09-29 2 views
1

J'ai une liste de tuples comme ci-dessous:retour des documents uniques et celui avec datetime max pour les enregistrements non uniques dans la liste des tuples

temp = [ 
(1676L, 530L, 'please submit your lab', datetime.datetime(2017, 9, 29, 11, 10, 18), None), 
(1677L, 527L, 'this is not the message youre looking for', datetime.datetime(2017, 9, 29, 11, 50, 27), None), 
(1675L, 529L, 'hi. please come to my office at 5', datetime.datetime(2017, 9, 29, 11, 10, 8), None), 
(1678L, 529L, 'hi. please come to my office at 6', datetime.datetime(2017, 9, 29, 11, 50, 56), None), 
(1674L, 528L, 'hi, my name is John', datetime.datetime(2017, 9, 29, 11, 9, 40), None), 
(543L, 527L, 'hi, this is message No 499', datetime.datetime(2017, 9, 26, 17, 53, 22), None) 
(1630L, 527L, 'hi, I love you', datetime.datetime(2017, 9, 28, 17, 50, 00), None) 
] 

le deuxième élément tuples est ids (530,527, etc. .), et le quatrième élément est le datetime. il peut y avoir plusieurs enregistrements dans la liste avec le même identifiant (c'est-à-dire que le 2ème et les 6ème et 7ème enregistrements ont l'ID = 527). Comment puis-je écrire un code en python qui retourne des enregistrements uniques (leur ID n'apparaissait qu'une seule fois) et s'ils ne sont pas uniques (il y a plusieurs enregistrements avec les mêmes identifiants dans la liste), ne renvoyez que celui avec le maximum datetime?

Répondre

-1

Vous devez faire quelque chose comme ci-dessous. Ce n'est pas élégant, mais c'est facile à comprendre. Fondamentalement, juste faire un dictionnaire où chaque élément est une liste des tuples avec le même identifiant. Lors de l'insertion de chaque tuple, vérifiez sa date pour voir si elle est supérieure à la précédente. De cette façon, tous les tuples dans le champ 'max' sont uniques, ou ont le plus grand datetime.

r = {} 
for t in temp: 
    i = t[1] 
    if not i in r: 
     r[i] = {"max":t, "tuples":[t]} 
    else: 
     r[i]["tuples"].append(t) 
     d1 = t[3] 
     d2 = r[i]["max"][3] 
     if d1 > d2: 
      r[i]["max"] = t 
2

Vous pouvez facilement faire cela en utilisant dictionary, en prenant la 2e col comme clé. Triez la liste en utilisant la colonne datetime dans ascending order. Et puisque la clé ne peut pas être dupliquée, vous aurez la valeur qui est dans le dernier (plus grande valeur si la clé est la même). Pour obtenir la liste, il suffit d'accéder au values.

#sort by datetime [3] col 
new_t = sorted(temp,key=lambda x: x[3]) 

#create dictionary with the [1] column as key 
max_dict = { x[1]: x for x in new_t } 

#get the required list 
print([val for val in max_dict.values()]) 

#driver valeurs

IN : 
temp = [ (1676L, 530L, 'please submit your lab', datetime.datetime(2017, 9, 29, 11, 10, 18), None), 
(1677L, 527L, 'this is not the message youre looking for', datetime.datetime(2017, 9, 29, 11, 50, 27), None), 
(1675L, 529L, 'hi. please come to my office at 5', datetime.datetime(2017, 9, 29, 11, 10, 8), None), 
(1678L, 529L, 'hi. please come to my office at 6', datetime.datetime(2017, 9, 29, 11, 50, 56), None), 
(1674L, 528L, 'hi, my name is John', datetime.datetime(2017, 9, 29, 11, 9, 40), None), 
(543L, 527L, 'hi, this is message No 499', datetime.datetime(2017, 9, 26, 17, 53, 22), None), 
(1630L, 527L, 'hi, I love you', datetime.datetime(2017, 9, 28, 17, 50, 00), None) ] 

OUT : 
[(1674L, 528L, 'hi, my name is John', datetime.datetime(2017, 9, 29, 11, 9, 40), None), 
(1678L, 529L, 'hi. please come to my office at 6', datetime.datetime(2017, 9, 29, 11, 50, 56), None), 
(1676L, 530L, 'please submit your lab', datetime.datetime(2017, 9, 29, 11, 10, 18), None), 
(1677L, 527L, 'this is not the message youre looking for', datetime.datetime(2017, 9, 29, 11, 50, 27), None)] 
+1

grande approche .. – tkhurana96

+0

Merci @ tkhurana96. La meilleure partie à ce sujet, je viens d'apprendre la chose à propos de «dictionnaire» en prenant la «dernière valeur» pour les clés en double il ya quelques heures lors de la résolution d'un autre problème. –

+0

De votre réponse j'ai appris la même chose aussi ... merci – tkhurana96