简体   繁体   中英

Python sort list by first number in a string

I would like to sort this list of strings by the first number preferably using using regular expressions in a single line but other suggestions are welcome. I am trying to get the quickest way of doing it. Here is the list;

[
  "10. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless I",
  "11. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless J",
  "12. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless K",
  "13. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless L",
  "14. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless M",
  "15. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless N",
  "16. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless O",
  "17. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless P",
  "18. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless Q",
  "19. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless R",
  "20. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless S",
  "21. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless z",
  "22. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless A",
  "5. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless D",
  "6. Command Mounting Refill Strips - Large Pack of 1 6 Strips E",
  "7. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless F",
  "8. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless G",
  "9. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless H"
]

This is the code that I have tried so far.

dirs = sorted(next(walk(self.rootDirectory))[1], key=lambda x: int(x[0]))

But this is returning;

[
  "10. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless I",
  "11. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless J",
  "12. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless K",
  "13. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless L",
  "14. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless M",
  "15. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless N",
  "16. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless O",
  "17. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless P",
  "18. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless Q",
  "19. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless R",
  "20. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless S",
  "21. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless z",
  "22. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless A",
  "5. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless D",
  "6. Command Mounting Refill Strips - Large Pack of 1 6 Strips E",
  "7. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless F",
  "8. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless G",
  "9. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless H"
]

Update

Can I also have an example of sorting it without having the . character. For example; "20 iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless S"

Convert to int after splitting on . to take the full numbers, not just the first digit:

lst = next(walk(self.rootDirectory))[1]
dirs = sorted(lst, key=lambda x: int(x.split('.')[0]))

To sort when the '.' are not certain to be in the strings:

dirs = sorted(lst, key=lambda x: float(x.split()[0]))

Works with or without the '.' .

If you wish to sort the list by numeric strings in general, consider a natural sorting algorithm .

Code

import re


def natural_key(string_):
    return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_) if s]

The latter code is modified from this SO post and assumes each string is enumerated such that the numeric strings a converted to numbers which can be sorted .

iterable = [
  "10. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless I",
  "11. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless J",
  "12. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless K",
  "13. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless L",
  "14. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless M",
  "15. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless N",
  "16. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless O",
  "17. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless P",
  "18. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless Q",
  "19. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless R",
  "20. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless S",
  "21. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless z",
  "22. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless A",
  "5. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless D",
  "6. Command Mounting Refill Strips - Large Pack of 1 6 Strips E",
  "7. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless F",
  "8. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless G",
  "9. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless H"
]

sorted(iterable, key=natural_key)

Output

['5. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless D',
 '6. Command Mounting Refill Strips - Large Pack of 1 6 Strips E',
 '7. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless F',
 '8. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless G',
 '9. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless H',
 '10. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless I',
 ...]
l = <your-list>
import re
sorted(l, key=lambda x:int(re.match(r'(\d+)',x).groups()[0]))

Output:

['5. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless D',
 '6. Command Mounting Refill Strips - Large Pack of 1 6 Strips E',
 '7. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless F',
 '8. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless G',
 '9. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless H',
 '10. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless I',
 '11. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless J',
 '12. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless K',
 '13. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless L',
 '14. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless M',
 '15. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless N',
 '16. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless O',
 '17. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless P',
 '18. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless Q',
 '19. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless R',
 '20. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless S',
 '21. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless z',
 '22. iTOMA Radio Alarm Clock FM Digital Radio Clock Bedside Alarm Clock Wireless A']

you can sort by the first element of the list by this way.

iterable.sort(key=lambda x: x[0])
print iterable

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