python-3.x 按值排序dict

flmtquvp  于 2023-11-20  发布在  Python
关注(0)|答案(3)|浏览(136)

我有一个名为grouped_items的初始dict,我需要通过

grouped_items =
{
    "tcp_permit": [],
    "tcp_deny": [],
    "udp_permit": [],
    "udp_deny": [],
    "ip_permit": [],
    "ip_deny": [],
    "icmp_permit": [],
    "icmp_deny": []
}

group_items = ['_7_tcp_permit_bgp', '_8_icmp_permit_', '_9_udp_permit_domain', '_10_ip_permit_']

separators = ['tcp_permit','tcp_deny', 'udp_permit','udp_deny', 'ip_permit','ip_deny', 'icmp_permit','icmp_deny']  

for item in group_items:       
        for separator in separators:
            if separator in item:
                grouped_items[separator].append(item)
                break

字符串
结果grouped_items:

grouped_items =
{
    "tcp_permit": [
        "_7_tcp_permit_bgp"
    ],
    "udp_permit": [
        "_9_udp_permit_domain"
    ],
    "ip_permit": [
        "_10_ip_permit_"
    ],
    "icmp_permit": [
        "_8_icmp_permit_"
    ]
}


目标:我想按照group_items而不是separator的顺序对grouped_items重新排序

grouped_items =
{
    "tcp_permit": [
        "_7_tcp_permit_bgp"
    ],
    "icmp_permit": [
        "_8_icmp_permit_"
    ],
    "udp_permit": [
        "_9_udp_permit_domain"
    ],
    "ip_permit": [
        "_10_ip_permit_"
    ]

}


我尝试使用

item_order = {item: index for index, item in enumerate(group_items)}

sorted_grouped_items = {key: grouped_items[key] for key in sorted(grouped_items, key=lambda x: item_order.get(x, float('inf')))}


但是仍然没有成功。有没有机会根据value而不是voa key重新排序dict?Python 3.11.3

k5ifujac

k5ifujac1#

谢谢你的回答,是的,我得到了同样的结果:顺便说一句,经过一些测试,我能够通过创建一个字典来存储group_items中的项目顺序来获得结果

item_order = {item: index for index, item in enumerate(group_items)}

字符串
然后

list_sorted_grouped_items = [(key, grouped_items[key]) for key in sorted(grouped_items, key=lambda x: item_order.get(grouped_items[x][0]))]


因此,基本上为group_items分配一个数字键,并将其用作排序操作符。

dict_sorted_grouped_items = dict(list_sorted_grouped_items)

fd3cxomn

fd3cxomn2#

我想:要创建一个包含字典'grouped_items'的键的列表,看起来你再次写入了所有键来形成一个列表。这不是必需的。只要通过我的代码
我已经省略了你已经声明的变量。所以,要检查输出,请添加你声明的变量。
下面的代码包含一个行将给予您想要的输出

#create a list separator

separators = [key for key in grouped_items.keys()]

grouped_items = {y:[x] for x in group_items for y in separators if y in x}

print(grouped_items)

字符串
上面的一个liner相当于下面的代码

separators = [key for key in grouped_items.keys()]
grouped_items ={}
for x in group_items:
    for y in separators:
        if y in x:
           grouped_items[y] = [x]
           break    
print(grouped_items)

tjjdgumg

tjjdgumg3#

grouped_items ={
    "tcp_permit": [],
    "tcp_deny": [],
    "udp_permit": [],
    "udp_deny": [],
    "ip_permit": [],
    "ip_deny": [],
    "icmp_permit": [],
    "icmp_deny": []
}

group_items = ['_7_tcp_permit_bgp', '_8_icmp_permit_', '_9_udp_permit_domain', '_10_ip_permit_']

separators = ['tcp_permit','tcp_deny', 'udp_permit','udp_deny', 'ip_permit','ip_deny', 'icmp_permit','icmp_deny']  

for item in group_items:       
        for separator in separators:
            if separator in item:
                grouped_items[separator].append(item)
                break

grouped_items = dict(sorted(grouped_items.items(), key=lambda x:x[1]))
print(grouped_items)

字符串
问题是,“_10_ip_permit”将排序在“_7_tcp_bgp_bgp”之前,因为字符串以“1”开头.
否则效果很好...
输出量:

grouped_items=
{
'tcp_deny': [], 
'udp_deny': [], 
'ip_deny': [], 
'icmp_deny': [], 
'ip_permit': ['_10_ip_permit_'], 
'tcp_permit': ['_7_tcp_permit_bgp'],
'icmp_permit': ['_8_icmp_permit_'], 
'udp_permit': ['_9_udp_permit_domain']
}

相关问题