首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于字母数字值的键排序python字典

基于字母数字值的键排序python字典
EN

Stack Overflow用户
提问于 2022-06-13 07:20:47
回答 3查看 65关注 0票数 1

我对蟒蛇很陌生。在Python中,我希望首先根据“年份”键对字典项列表进行排序,然后使用字母数字( P1、P2、P3 )键对字典项进行排序。

代码片段如下所示:

代码语言:javascript
运行
复制
[
    {"P9": 0, "year": 2023},
    {"P13": 0, "year": 2023},
    {"P10": 0, "year": 2023},
    {"P11": 121200, "year": 2022},
    {"P12": 0, "year": 2023},
]

第一次按年排序的为:

代码语言:javascript
运行
复制
[
    {"P11": 121200, "year": 2022},
    {"P9": 0, "year": 2023},
    {"P13": 0, "year": 2023},
    {"P10": 0, "year": 2023},
    {"P12": 0, "year": 2023},
]

再次按句号( P1、P2、P3等)排序为:

代码语言:javascript
运行
复制
[
    {"P11": 121200, "year": 2022},
    {"P9": 0, "year": 2023},
    {"P10": 0, "year": 2023},
    {"P12": 0, "year": 2023},
    {"P13": 0, "year": 2023},
]

上面是预期的输出,现在我不知道该如何分类

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-06-13 07:37:39

对于排序第一个基本years,然后排序每个dict的基第一个键,您可以捕获数字并转换为int,然后进行排序,如下所示:

代码语言:javascript
运行
复制
>>> sorted(lst_dct, key=lambda x: (x['year'], int(list(x.keys())[0][1:])))
[{'P11': 121200, 'year': 2022},
 {'P9': 0, 'year': 2023},
 {'P10': 0, 'year': 2023},
 {'P12': 0, 'year': 2023},
 {'P13': 0, 'year': 2023}]
票数 0
EN

Stack Overflow用户

发布于 2022-06-13 07:31:53

排序函数可以满足您的需要

您可以传递一个键函数(可调用的)来标识正确的顺序。就你而言:

代码语言:javascript
运行
复制
unordered = [{'P9': 0, 'year': 2023}, {'P13': 0, 'year': 2023}, {'P10': 0, 'year': 2023}, {'P11': 121200, 'year': 2022}, {'P12': 0, 'year': 2023}]

#by year

sorted(unordered, key=lambda x: x['year'])
# out
[{'P11': 121200, 'year': 2022},
 {'P9': 0, 'year': 2023},
 {'P13': 0, 'year': 2023},
 {'P10': 0, 'year': 2023},
 {'P12': 0, 'year': 2023}]

对于这段时间,解决方案有点棘手,您必须确定如何选择P**键。我们不知道这些字典是如何构建的,但我们做了一些假设,比如:

代码语言:javascript
运行
复制
sorted(unordered, key=lambda x: [lbl for lbl in x if lbl.startswith('P')][0] )

但这里缺乏更准确的信息。

票数 4
EN

Stack Overflow用户

发布于 2022-06-13 07:41:00

您可以使用排序函数,并使用它指定一个键函数。但是,由于您想要使用两个单独的数据点作为键,所以可以使用tuple构建一个键。

因为当比较元组时,它首先比较其中的第一个实体,如果第一个实体匹配,则检查第二个实体。

示例:

代码语言:javascript
运行
复制
>>> (1,3) > (1, 4)
False

>>> (1, 4) < (2,2)
True

>>> (1, 4, 1) < (2, 1)
True

下面是如何构建您的关键功能:

代码语言:javascript
运行
复制
>>> unordered = [{'P9': 0, 'year': 2023}, {'P13': 0, 'year': 2023}, {'P10': 0, 'year': 2023}, {'P11': 121200, 'year': 2022}, {'P12': 0, 'year': 2023}]
>>> ordered = sorted(
    unordered,
    key=lambda d: (d['year'], next(int(k[1:]) for k in d.keys() if k.startswith('P')))
)

>>> ordered
[{'P11': 121200, 'year': 2022}, {'P9': 0, 'year': 2023}, {'P10': 0, 'year': 2023}, {'P12': 0, 'year': 2023}, {'P13': 0, 'year': 2023}]

在这里,我假设字典中总是有一个以P开头的键,其馀部分是整数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72599038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档