gpt4 book ai didi

python - 按键对字典项目进行排序,超越字母数字排序

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:20 24 4
gpt4 key购买 nike

我写了这段代码:

n=5
dizN={}
for q in range(0,n+1):
h=n-q
dizN['a'+str(q)+'p'+str(h)]=0

创建这样一个字典:

迪兹N

Out[120]: {'a0p5': 0, 'a1p4': 0, 'a2p3': 0, 'a3p2': 0, 'a4p1': 0, 'a5p0': 0}

请注意,“n”是我的代码的基本参数。正如您所看到的,字典键字符串中存在的整数总和始终=n(在本例中=5,其中n=5)。

对我来说很重要(对于我的程序中更困难的目的),对于每个人都可以选择的 n ,字典的排序方式如下:

{'a0p(n)': 0, 'a1p(n-1)': 0, ....., 'a(n-1)p1': 0, 'a(n)p0': 0}

我的代码没问题,但仅限于 n<10。 如果 n >=10,则会发生以下情况:(n=12) dizN:

Out[121]: 
{'a0p12': 0,
'a10p2': 0,
'a11p1': 0,
'a12p0': 0,
'a1p11': 0,
'a2p10': 0,
'a3p9': 0,
'a4p8': 0,
'a5p7': 0,
'a6p6': 0,
'a7p5': 0,
'a8p4': 0,
'a9p3': 0}

正如您所看到的,解释器遵循字母数字排序;

有人知道是否有办法获得以这种方式排序的相同字典:

{'a0p12': 0,
'a1p11': 0,
'a2p10': 0,
'a3p9': 0,
'a4p8': 0,
'a5p7': 0,
'a6p6': 0,
'a7p5': 0,
'a8p4': 0,
'a9p3': 0,
'a10p2': 0,
'a11p1': 0,
'a12p0': 0}

我知道字典基本上是不可排序的,但我希望有人知道一些技巧来实现我的目的:)

非常感谢!

最佳答案

字典无序的,因此要获得顺序,您必须对项目进行排序并使用OrderedDict来维护排序命令。要获得所需的顺序,您可以从整数组创建元组,以便按字典顺序对整数进行排序:

from itertools import groupby
from collections import OrderedDict
d = {'a0p12': 0, 'a10p2': 0, 'a11p1': 0, 'a12p0': 0, 'a1p11': 0, 'a2p10': 0,
'a3p9': 0, 'a4p8': 0, 'a5p7': 0, 'a6p6': 0, 'a7p5': 0, 'a8p4': 0, 'a9p3': 0}

def key_func(x):
"""'a0p12' -> (0, 12)"""
return tuple(int("".join(v)) for k,v in groupby(x[0], key=str.isdigit) if k)
od = OrderedDict(sorted(d.items(), key=key_func))

print(od)

这会给你:

OrderedDict([('a0p12', 0), ('a1p11', 0), ('a2p10', 0), ('a3p9', 0), 
('a4p8', 0), ('a5p7', 0), ('a6p6', 0), ('a7p5', 0), ('a8p4', 0),
('a9p3', 0), ('a10p2', 0), ('a11p1', 0), ('a12p0', 0)])

您还可以使用正则表达式来查找数字组:

from collections import OrderedDict
import re

d = {'a0p12': 0, 'a10p2': 0, 'a11p1': 0, 'a12p0': 0, 'a1p11': 0, 'a2p10': 0,
'a3p9': 0, 'a4p8': 0, 'a5p7': 0, 'a6p6': 0, 'a7p5': 0, 'a8p4': 0, 'a9p3': 0}



def key_func(x,patt=re.compile("\d+")):
"""'a0p12' -> (0, 12)"""
return tuple(map(int, patt.findall(x[0])))

od = OrderedDict(sorted(d.items(), key=key_func))

print(od)

关于python - 按键对字典项目进行排序,超越字母数字排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40088527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com