简体   繁体   中英

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]]

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.

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

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]]

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM