2017-06-21 49 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

雖然這段代碼可能會回答這個問題,爲什麼和/或這個代碼如何回答這個問題提高了它的長期價值。 –