Tengo un nested list en un list. En la primera lista anidada, tiene dates y en la segunda, tiene values correspondiente a la fecha. Necesito ordenar la fecha en la lista anidada. Según la fecha, se debe ordenar el valor correspondiente. Sé que sorted(list) funciona. Pero no sé cómo ordenar la lista anidada value de acuerdo con date. Quiero que el tipo date esté en string y no en date. Ayúdame con algunas soluciones.

Aquí está la lista:

a = [["2019-10-13","2019-10-12","2019-10-14","2019-10-11"],[10,28,5,37]]

Salida requerida

a = [["2019-10-11","2019-10-12","2019-10-13","2019-10-14"],[37,28,10,5]]
0
crust salty 11 oct. 2019 a las 11:17

4 respuestas

La mejor respuesta

No es una frase, pero para aquellos para quienes pandas es su opción:

import pandas as pd

a = [["2019-10-13","2019-10-12","2019-10-14","2019-10-11"],[10,28,5,37]]

df = pd.DataFrame({'dates': a[0], 'values':a[1]}).sort_values('dates')
b = [df['dates'].tolist()] + [df['values'].tolist()]

print(b)

Salida:

Esto retiene la estructura [[list], [list]] de su pregunta.

[['2019-10-11', '2019-10-12', '2019-10-13', '2019-10-14'], [37, 28, 10, 5]]
1
S3DEV 11 oct. 2019 a las 08:32

Solución de línea única:

list(zip(*sorted(zip(*a), key=lambda x: x[0])))

Explicación:

  • zip(*a) hace pares cada fecha con su valor
  • luego lo ordenamos por el primer elemento del par (key es la función utilizada para ordenar, x es un argumento único pasado - en nuestro caso un par, y usamos x[0] para obtener la fecha )
  • lo volvemos a poner en fechas y números respectivamente
  • y convertir objetos zip en una lista

Resultados:

>>> list(zip(*sorted(zip(*a), key=lambda x: x[0])))
[('2019-10-11', '2019-10-12', '2019-10-13', '2019-10-14'), (37, 28, 10, 5)]

Editar: leí tu pregunta por completo y cambié. Pensé que estabas ordenando fechas por valores, no al revés, ¡Uy! Ahora es correcto (el resultado es el mismo).

2
h4z3 11 oct. 2019 a las 08:24

En el caso de que su formato de fecha pueda ser variable, y la ordenación basada en la representación de cadena de la fecha puede no producir los efectos deseados, usar una de las bibliotecas de fecha y hora (ya sea directamente o, por ejemplo, a través de pandas) será más preciso.

No es de una sola línea, pero podría ser más robusto:

a = [["2019-10-13", "2019-10-12", "2019-10-14", "2019-10-11"], [10, 28, 5, 37]]


df = (
    pd.DataFrame(a, index=["date", "value"])
    .T.astype({"date": "datetime64", "value": "int"})
    .sort_values("date")
)

df["date"] = df["date"].apply(lambda x: str(x.date()))  # date as strings

output = [list(col) for col in df.T.values]

Esto da el resultado deseado como listas anidadas:

[['2019-10-11', '2019-10-12', '2019-10-13', '2019-10-14'], [37, 28, 10, 5]]

0
metasomite 11 oct. 2019 a las 08:46

Comprima dos listas, luego ordénelas:

a = zip(["2019-10-13","2019-10-12","2019-10-14","2019-10-11"],[10,28,5,37])

Después de ordenar el resultado sería:

>>> sorted(a)
[('2019-10-11', 37), ('2019-10-12', 28), ('2019-10-13', 10), ('2019-10-14', 5)]

Asigne la lista ordenada a una variable, luego descomprímala:

>>> a = sorted(a)
>>> list(zip(*a))
[('2019-10-11', '2019-10-12', '2019-10-13', '2019-10-14'), (37, 28, 10, 5)]
0
Mohsen_Fatemi 11 oct. 2019 a las 08:24
58337044