社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

crust salty • 4 年前 • 793 次点击  

我有一个 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
 
793 次点击  
文章 [ 4 ]  |  最新文章 4 年前
metasomite
Reply   •   1 楼
metasomite    4 年前

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

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

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    4 年前

单线解决方案:

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    4 年前

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