0

I have below list of dictionary. I want to get an ordered dictionary on the basis of server_resource_name. I followed How to correctly sort a string with a number inside? but I wonder if there is something more pythonic?

ls = [
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",      
        "server_resource_name": "i10_instance"
    },
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",
        "server_resource_name": "i11_instance"
    },

    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",
        "server_resource_name": "i7_instance"
    },
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",      
        "server_resource_name": "i8_instance"
    },
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",
        "server_resource_name": "i9_instance"
    }
]

I am looking for output to be like below

ls = [
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",      
        "server_resource_name": "i7_instance"
    },
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",
        "server_resource_name": "i8_instance"
    },

    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",
        "server_resource_name": "i9_instance"
    },
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",      
        "server_resource_name": "i10_instance"
    },
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",
        "server_resource_name": "i11_instance"
    }
]

What I tried

test1 = []
for i in ls:
     i['server_resource_name']
     test1.append(i['server_resource_name'])
import re
def natural_key(string_):
    return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_)]

This gives me the sorted result in test2. How do I get the ls now to be in sorted fashion?

print("-->", sorted(test1, key=natural_key))
JustCurious
  • 111
  • 3
  • 14
  • The above mentioned is a list and not a dictionary – Athul Soori Jan 17 '18 at 09:40
  • Keyfunc is the way to go. The solution in the question you posted is pythonic. No need to seek an alternate solution. – sytech Jan 17 '18 at 09:41
  • 3
    Possible duplicate of [How to correctly sort a string with a number inside?](https://stackoverflow.com/questions/5967500/how-to-correctly-sort-a-string-with-a-number-inside) – sytech Jan 17 '18 at 09:41
  • You should simplify your question to simply "How do I sort strings with numbers like humans do". No need for an elaborate listing of irrelevant stuff. – csl Jan 17 '18 at 09:47

2 Answers2

3

Thats works maybe there are better way to do it

# Thats for parse number of instance
# print(int(re.findall(r'\d+', ls[0]["server_resource_name"])[0]))
sorted_ls = sorted(ls, key=lambda x: int(re.findall(r'\d+', x["server_resource_name"])[0]))
print(sorted_ls)
Boris
  • 166
  • 2
  • I used this Boris. This seems to be working. Can you also explain what you did? Thanks so much – JustCurious Jan 17 '18 at 09:53
  • for begin read about sorted() function, ls - your list, and also i giving lambda returning keys, in your case it x["server_resource_name"] (x current element of the list) but it's string, re.findall(r'\d+', x["server_resource_name"])[0], returns list of all numbers but in string type – Boris Jan 17 '18 at 10:13
0

May be you can try following:

import re
p=re.compile('(\d+)')
ls.sort(key=lambda x: int(p.findall(x['server_resource_name'])[0] ))
Vikram Patil
  • 628
  • 6
  • 20