Сортировать вложенный список на основе другого отсортированного вложенного списка Python - PullRequest
0 голосов
/ 11 октября 2019

У меня есть nested list в list. В первом вложенном списке он имеет dates, а во втором - values, соответствующий дате. Мне нужно отсортировать дату во вложенном списке. На основе даты должно быть отсортировано соответствующее значение. Я знаю sorted(list) работает. Но я не знаю, как отсортировать вложенный список value по date. Я хочу, чтобы тип date был в string, а не date. Помогите мне с некоторыми решениями.

Вот список:

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

Требуется вывод

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

Ответы [ 4 ]

2 голосов
/ 11 октября 2019

Решение для одной строки:

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

Объяснение:

  • zip(*a) создает пары для каждой даты со значением
  • , затем мы сортируем ее по первому элементупары (key - функция, используемая для сортировки, x - один передаваемый аргумент - в нашем случае пара, и мы используем x[0] для получения даты)
  • мы возвращаем ее обратно в датыи цифры соответственно
  • и преобразование zip-объекта в список

Результаты:

>>> 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)]

Редактировать: я полностью прочитал ваш вопрос и изменился. Я думал, что вы сортируете даты по значениям, а не наоборот, упс. Теперь это правильно (результат тот же).

1 голос
/ 11 октября 2019

Это не однострочный текст, но для тех, для кого pandas их переход:

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)

Вывод:

При этом сохраняется структура [[list], [list]] от вашеговопрос.

[['2019-10-11', '2019-10-12', '2019-10-13', '2019-10-14'], [37, 28, 10, 5]]
0 голосов
/ 11 октября 2019

В случае, если ваш формат даты может быть переменным, и сортировка на основе строкового представления даты может не дать желаемых результатов, использование одной из библиотек даты и времени (либо напрямую, либо, например, через панд) будетболее точным.

Это не однострочник, но может быть более надежным:

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]

Это дает желаемый результат в виде вложенных списков:

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

0 голосов
/ 11 октября 2019

zip два списка, затем сортируйте их:

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

после сортировки результат будет:

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

Назначьте отсортированный список переменной, затем распакуйте его:

>>> a = sorted(a)
>>> list(zip(*a))
[('2019-10-11', '2019-10-12', '2019-10-13', '2019-10-14'), (37, 28, 10, 5)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...