Quiero crear un diccionario de una lista. Quiero que el valor se reemplace si se encuentra una fecha posterior.

Así:

import datetime

values=[['A',datetime.date(2017,1,1)],
        ['B',datetime.date(2001,2,2)],
        ['A',datetime.date(2017,10,21)],
        ['B',datetime.date(2005,6,3)]]
d={}

for (k,v) in values:
   if k not in d:
      d[k]=v
   else:
      if d[k]<v:
         d[k]=v

print(d)
{'B': datetime.date(2005, 6, 3), 'A': datetime.date(2017, 10, 21)}

Debe haber una manera más fácil con menos código. ¿Cómo puedo hacer esto más eficiente, tal vez con la comprensión del diccionario?

1
BERA 31 oct. 2017 a las 17:07

4 respuestas

La mejor respuesta

Si pasa una lista de claves, pares de valores a dict, conserva el último par si hay claves duplicadas. Entonces, primero puede ordenar su lista por los valores de fecha y hora y luego construir el diccionario usando esa lista ordenada:

d = dict(sorted(values, key=lambda x: x[1]))

print(d)
{'A': datetime.date(2017, 10, 21), 'B': datetime.date(2005, 6, 3)}

EDITAR

Como @ HåkenLid señala en los comentarios, no necesita la función key en sorted ya que solo nos importa el orden si el primer elemento es el mismo de todos modos. Entonces podemos decir:

d = dict(sorted(values))
3
bunji 31 oct. 2017 a las 15:14

Creo que su código es muy legible, así que no trataría de forzar la comprensión de un diccionario. ¿Quizás simplificar un poco la declaración if?

for (k,v) in values:
   if k not in d or d[k]<v:
      d[k]=v

Esto funciona porque d[k]<v solo se ejecutará si k not in d ha demostrado que esa clave existe.

1
Tim Pietzcker 31 oct. 2017 a las 14:18

Una solución con ternaria condicional.

for k, v in values:
    d[k] = max(v, d[k]) if k in d else v

O usando dict.get() con el valor predeterminado.

for k, v in values:
    d[k] = max(v, d.get(k, v))
0
Håken Lid 31 oct. 2017 a las 14:57

Prueba esto,

{k[0]:k[1] for k in values}
-1
Codee 31 oct. 2017 a las 14:21