根据另一个排序的嵌套列表python对嵌套列表进行排序

时间:2019-10-11 08:17:46

标签: python python-3.x list sorting

我在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 个答案:

答案 0 :(得分:2)

单行解决方案:

A VirtualBox machine with the name 'petalandstem' already exists.
Please use another name or delete the machine with the existing
name, and try again.

说明:

  • list(zip(*sorted(zip(*a), key=lambda x: x[0]))) 将每个日期与其值配对
  • 然后我们按对中的第一个元素对其进行排序(zip(*a)是用于排序的函数,key是传递的单个参数-在我们的例子中是一对,我们使用x获取日期)
  • 我们分别将其压缩回日期和数字
  • 并将zip对象转换为列表

结果:

x[0]

编辑:我已完全阅读您的问题并进行了更改。我以为您是按值排序日期,而不是相反。现在是正确的(结果相同)。

答案 1 :(得分: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]]

答案 2 :(得分: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)]

答案 3 :(得分:0)

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

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

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