Py学习  »  Python

基于另一个排序嵌套列表python对嵌套列表进行排序

crust salty • 5 年前 • 1593 次点击  

我有一个 nested list 在一个 list 是的。在第一个嵌套列表中,它有 dates 第二,它有 values 与日期相对应。我需要对嵌套列表中的日期进行排序。应根据日期对相应的值进行排序。我知道 sorted(list) 作品。但我不知道如何分类 value 根据 date 是的。我想要 日期 输入 string 而不是 日期 是的。帮我解决一些问题。

这是名单:

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]]
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/46774
 
1593 次点击  
文章 [ 4 ]  |  最新文章 5 年前
metasomite
Reply   •   1 楼
metasomite    5 年前

如果您的日期格式可能是可变的,并且基于日期的字符串表示进行排序可能不会产生所需的效果,那么使用其中一个日期时间库(直接或通过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]]

Mohsen_Fatemi
Reply   •   2 楼
Mohsen_Fatemi    5 年前

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

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)]
h4z3
Reply   •   3 楼
h4z3    5 年前

单线解决方案:

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

编辑:我把你的问题读了一遍,改了。我以为你是按值来排序,而不是相反,哎呀。现在它是正确的(结果是一样的)。

S3DEV
Reply   •   4 楼
S3DEV    5 年前

这不是一条单行线,而是为那些 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]]