Binit Singh
Binit Singh

Reputation: 983

Python sort list of list containing integer and string with integers inside

How i can use python to sort the list format

format=["12 sheet","4 sheet","48 sheet","6 sheet", "busrear", "phonebox","train"]

like this way

format =["4 sheet", "6 sheet", "12 sheet", "48 sheet", "busrear", "phonebox", "train"]

whose answer is here Python sort array of string with integers inside

but If the array is a list of list then how can we do that like this one

format=[[1, '12 sheet', 0],[2, '4 sheet', 0], [3, '48 sheet', 0], [4, '6 sheet', 0 [5, 'Busrear', 0], [6, 'phonebox', 0], [7, 'train', 0]]

I Need the result to be like this

format=[[2, '4 sheet', 0],[4, '6 sheet', 0],[1, '12 sheet', 0],[3, '48 sheet', 0],[5, 'Busrear', 0], [6, 'phonebox', 0], [7, 'train', 0]]

Upvotes: 4

Views: 17699

Answers (5)

Gaurav
Gaurav

Reputation: 41

a = [5,1,"a","A",2]
a = list(map(int,filter(lambda x:x.isdigit(),sorted(map(str,a)))))+list(filter(lambda x:x.isalpha(),sorted(map(str,a))))
print(a)

Upvotes: 0

thefourtheye
thefourtheye

Reputation: 239473

The same solution can be used here

print sorted(format_data, key=lambda x: (int(x[1].split(None, 1)[0]) if x[1][:1].isdigit() else 999, x))

Note the x[1] instead of just x. x[1] means the second element in x.

Result:

[[2, '4 sheet', 0],
 [4, '6 sheet', 0],
 [1, '12 sheet', 0],
 [3, '48 sheet', 0],
 [5, 'Busrear', 0],
 [6, 'phonebox', 0],
 [7, 'train', 0]]

Upvotes: 1

jsalonen
jsalonen

Reputation: 30481

You can trivially sort a list of strings with built-in sorted method. Even if the objects in your list are more complex, you can still use sorted. Just pass a custom key parameter to use the second item from the inner list as the key in ordering comparisons:

result = sorted(format, key=lambda x: x[1])

Finally switch to your sorting function natsorted (from natsort package) and you end up with the desired, naturally sorted, result list:

from natsort import natsorted
result = natsorted(format, key=lambda x: x[1])

Upvotes: 3

YS-L
YS-L

Reputation: 14738

You can do this:

lst = [[1L, u'12 sheet', 0],
       [2L, u'4 sheet', 0],
       [3L, u'48 sheet', 0],
       [4L, u'6 sheet', 0],
       [5L, u'Busrear', 0],
       [6L, u'phonebox', 0],
       [7L, u'train', 0]]

def sortby(x):
    try:
        return int(x[1].split(' ')[0])
    except ValueError:
        return float('inf')

lst.sort(key=sortby)
print lst

Output:

[[2L, u'4 sheet', 0], [4L, u'6 sheet', 0], [1L, u'12 sheet', 0], [3L, u'48 sheet', 0], [5L, u'Busrear', 0], [6L, u'phonebox', 0], [7L, u'train', 0]]

You can always use fancier list comprehension but readability counts. Which is why you might not feel like modifying the cool solution by falsetru for this slightly changed task.

Upvotes: 5

Neel
Neel

Reputation: 21243

you can use sorted or list.sort

>>> format.sort(key=lambda x: (x[1]))
[[1L, u'12 sheet', 0], [2L, u'4 sheet', 0], [3L, u'48 sheet', 0], [4L, u'6 sheet', 0], [5L, u'Busrear', 0], [6L, u'phonebox', 0], [7L, u'train', 0]]

Upvotes: 1

Related Questions