Order dict by value

67 Views Asked by At

I have an initial dict named grouped_items and i need to populate it via

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 



Result 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_"
    ]
}

Target: I want to reorder the grouped_items following the order of group_items and not of separator

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

}

I try to use the

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')))}

But still no success. Is there any chance to reorder the dict based on value and not voa key? Python 3.11.3

3

There are 3 best solutions below

0
On
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)

The problem is that "_10_ip_permit" will be sorted before "_7_tcp_permit_bgp" because the string starts with "1"...

Else it works well...

Output :

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']
}
0
On

I think: To create a list containing the keys of the dict 'grouped_items', It looks like you wrote all the keys once again to form a list. That is not required. Just go thru my code

I have omited the variables you declared already. So, to check the output add the variables you declared.

The following codes containing one liners will give you your desired output

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

The above one liner is equivalent to the following code

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)
0
On

Thanks for the answer and yes I reached same result: btw after some test I was able to get the result by Create a dictionary to store the order of items in group_items

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

and then

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

so basically assign a numerical key to group_items and using it as sort operator. Result is a list which I then convert to a dict via

  dict_sorted_grouped_items = dict(list_sorted_grouped_items)