2017-06-21 47 views
5

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

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

将成为

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

总之,它只是排序列表中的字符串,不是整数,它们保持不变。我试过用key参数与list.sort(),但没有设法达到我想要的。

任何人都可以帮助我吗?

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

编辑:这是不同的第二个链接的问题,因为该问题的答案可以使用key参数解决问题,我明确指出的东西在这种情况下不起作用。

+0

不知道为什么我的评论被删除,这当然是相关的:https://stackoverflow.com/questions/40737145/sort-a-sublist-of-elements-in-a-list-leaving-the-rest- in-place –

回答

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] 

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

+0

我实际上已经提出了这个解决方案。但我知道仅仅基于你的解决方案是O(n^2)并且使原始数组的内存占用空间增加一倍这一事实投下选票的选民。 –

+0

@MosesKoledoye我看到一个模拟问答,有奇数和偶数。这是同一个吗? –

+0

@ Jean-FrançoisFabre是的,那个。 –

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) 

结果:

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

首先,你的阵列只与字符串中提取它进行排序,那么你替换字符串原始数组中一步一步:

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 
+0

虽然这段代码可能会回答这个问题,为什么和/或这个代码如何回答这个问题提高了它的长期价值。 –