如何排序列表,只排序字符串?

cai*_*ing 5 python sorting list

我有一个字符串和整数列表,并希望对列表进行排序,保留这样的数字

["Hello", 1, 2, "World", 6, "Foo", 3]
Run Code Online (Sandbox Code Playgroud)

会成为

["Foo", 1, 2, "Hello", 6, "World", 3]
Run Code Online (Sandbox Code Playgroud)

简而言之,它只对列表中的字符串进行排序,而不是整数,它们保留在原位.我已经尝试使用key参数,list.sort()但没有设法实现我想要的.

谁能帮我这个?

编辑:这与链接的问题不同,因为我想保留整数的索引,而不是将它们与字符串一起排序.

编辑:这与第二个链接的问题不同,因为该问题的答案可以使用key参数解决问题,我明确声明的内容在此实例中不起作用.

Mos*_*oye 15

前几天从@JonClements中挑选了这个很酷的技巧.

开始:

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]
Run Code Online (Sandbox Code Playgroud)

单独对字符串排序并从排序的字符串创建生成器表达式.在列表理解中,从gen中交替选择对象.进出口.如果只有原始位置的项是字符串,则使用三元条件,否则,从初始列表中选择一个项(整数).

  • 如果存在惰性排序算法,唯一可以变得更美丽的方法. (4认同)
  • 通过在`sort`中强制列表理解,@ MosesKoledoye可能会稍快一些:`gen = iter(sorted([x for x in l if isinstance(x,str)]))`因为它无论如何都需要构建它.(顺便说一下,我们在这个网站上花了太多时间) (2认同)

Jea*_*bre 8

首先,像这样的异类列表的排序仅适用于Python 2.但结果并不是您需要的.

我将在已过滤列表的排序版本上创建一个迭代器(仅保留字符串),并使用此迭代器的项或原始列表重建列表,具体取决于元素类型:

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)
Run Code Online (Sandbox Code Playgroud)

结果:

['Foo', 1, 2, 'Hello', 6, 'World', 3]
Run Code Online (Sandbox Code Playgroud)