0

我有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

4 回答 4

2

单线解决方案:

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

编辑:我完全阅读了你的问题并改变了。我以为你是按值排序日期,而不是相反,哎呀。现在它是正确的(结果是一样的)。

于 2019-10-11T08:24:00.897 回答
1

这不是单线,但对于那些他们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]]
于 2019-10-11T08:32:44.380 回答
0

压缩两个列表,然后对它们进行排序:

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)]
于 2019-10-11T08:24:02.077 回答
0

如果您的日期格式可能是可变的,并且基于日期的字符串表示的排序可能不会产生预期的效果,则使用日期时间库之一(直接或例如通过 pandas)会更准确。

它不是单行的,但可能更强大:

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

于 2019-10-11T08:46:08.020 回答