Ordenar una lista mixta de caracteres y cadenas

Estoy tratando de ordenar la siguiente lista mixta de cadenas y cadenas, pero obtengo un TypeError en su lugar. Mi orden de salida deseado son números enteros ordenados y luego cadenas ordenadas.

x=[4,6,9,'ashley','drooks','chay','poo','may'] >>> x.sort() Traceback (most recent call last): File "", line 1, in  x.sort() TypeError: '<' not supported between instances of 'str' and 'int' 

Puede pasar una función de tecla personalizada a list.sort :

 x = [4,6,9,'ashley','drooks','chay','poo','may'] x.sort(key=lambda v: (isinstance(v, str), v)) # result: # [4, 6, 9, 'ashley', 'chay', 'drooks', 'may', 'poo'] 

Esta función clave asigna cada elemento de la lista a una tupla en la que el primer valor es booleano ( True para cadenas y False para números) y el segundo valor es el elemento en sí, como este:

 >>> [(isinstance(v, str), v) for v in x] [(False, 4), (False, 6), (False, 9), (True, 'ashley'), (True, 'chay'), (True, 'drooks'), (True, 'may'), (True, 'poo')] 

Estas tuplas se utilizan para ordenar la lista. Debido a que False < True , esto hace que los enteros se ordenen antes de las cadenas. Los elementos con el mismo valor booleano se ordenan por el segundo valor en la tupla.

Puedo ver en tu comentario que quieres que los enteros se ordenen primero y luego las cadenas.

Así que podríamos ordenar dos listas separadas y unirlas de la siguiente manera:

 x=[4,6,9,'ashley','drooks','chay','poo','may'] intList=sorted([i for i in x if type(i) is int]) strList=sorted([i for i in x if type(i) is str]) print(intList+strList) 

Salida:

[4, 6, 9, ‘ashley’, ‘chay’, ‘drooks’, ‘may’, ‘poo’]