Use a custom compare function that converts the strings into sub-lists of integers. Those will sort correctly without problems.
In [4]: ls = ['1.1', '1.10', '1.2', '1.2.3', '1.2.1', '1.9']
In [5]: def section(s):
...: return [int(_) for _ in s.split(".")]
...:
In [6]: sorted(ls, key=section)
Out[6]: ['1.1', '1.2', '1.2.1', '1.2.3', '1.9', '1.10']