Reputation: 983
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
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
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
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
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
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