¿Cómo ordenar una lista, solo ordenar cadenas?

Tengo una lista de cadenas y enteros y quiero ordenar la lista, conservando los números como tal

["Hello", 1, 2, "World", 6, "Foo", 3] 

se convertiría

 ["Foo", 1, 2, "Hello", 6, "World", 3] 

En resumen, solo ordena las cadenas en la lista, no los enteros, que permanecen en su lugar. He intentado usar el parámetro key con list.sort() pero no he logrado alcanzar lo que quiero.

Puede alguien ayudarme con esto?

EDIT: esto es diferente a la pregunta vinculada, ya que deseo preservar los índices de los enteros, en lugar de ordenarlos junto con las cadenas.

EDITAR: esto es diferente a la segunda pregunta vinculada, ya que las respuestas de esa pregunta pueden resolver el problema utilizando el parámetro key , algo que explícitamente he declarado que no funciona en este caso.

Recogió este truco genial de @JonClements el otro día.

Aquí va:

 gen = iter(sorted([x for x in lst if isinstance(x, str)])) new_lst = [next(gen) if isinstance(x, str) else x for x in lst] print(new_lst) # ['Foo', 1, 2, 'Hello', 6, 'World', 3] 

Ordene las cadenas por separado y cree una expresión generadora a partir de las cadenas ordenadas. En una lista de comprensión , elija objetos alternativamente del gen. exp. utilizando un condicional ternario si solo los elementos en la posición original son una cadena, de lo contrario, seleccione un elemento (un número entero) de la lista inicial.

Primero, la clasificación de una lista heterogénea como esta solo funciona en Python 2. Pero el resultado no es lo que necesita.

Yo crearía un iterador en la versión ordenada de la lista filtrada (manteniendo solo la cadena) y reconstruiría la lista con un elemento de este iterador o la lista original dependiendo del tipo de elemento:

 l = ["Hello", 1, 2, "World", 6, "Foo", 3] sgen = iter(sorted([x for x in l if isinstance(x,str)])) result = [next(sgen) if isinstance(x,str) else x for x in l] print(result) 

resultado:

 ['Foo', 1, 2, 'Hello', 6, 'World', 3] 

Primero ordena la matriz solo con la cadena para extraerla, luego reemplaza las cadenas paso a paso en la matriz original:

 l = ["Foo", 1, 2, "Hello", 6, "World", 3] s = [x for x in l if type(x) == str] s.sort() j = 0 for i, x in enumerate(l): if type(x) == str: l[i] = s[j] j += 1