try :
lst = ["A", "b", "C", "adam", "ADam", "EVe", "eve", "Eve", "d", "Adam"]
tmp = {}
for i, word in enumerate(map(str.lower, lst)):
if word not in tmp:
tmp[word] = i
lst = sorted(lst, key=lambda w: (tmp[w.lower()], w))
print(lst)
打印:
['A', 'b', 'C', 'ADam', 'Adam', 'adam', 'EVe', 'Eve', 'eve', 'd']
比较我的答案和@Mozway的答案的基准:
import numpy as np
import pandas as pd
from timeit import timeit
lst = ["A", "b", "C", "adam", "ADam", "EVe", "eve", "Eve", "d", "Adam"]
def sort_1(lst):
tmp = {}
for i, word in enumerate(map(str.lower, lst)):
if word not in tmp:
tmp[word] = i
lst.sort(key=lambda w: (tmp[w.lower()], w))
return lst
def sort_2(s):
return s.iloc[np.lexsort([s, pd.factorize(s.str.lower())[0]])]
t1 = timeit("sort_1(l)", setup="l = lst*10_000", number=1, globals=globals())
t2 = timeit("sort_2(s)", setup="s = pd.Series(lst*10_000)", number=1, globals=globals())
print(t1)
print(t2)
我的机器上的 fingerprint :Python3.9/AMD 3700x:
0.04437247384339571
0.05633149994537234