我有一个这样的字符串列表: ['A', 'b','C','adam','ADam','EVe','eve','Eve','d','Adam']

我只需要在字符串中对重复的值only进行排序,以获得以下输出 ['A', 'b','C','ADam','Adam','adam','EVe','Eve','eve','d']

在这里,‘Adam’,‘Adam’,‘Adam’原本在列表中的不同位置,但按照标准排序,它们应该是这样的.因此,当排序方法看到‘Adam’时,它应该try 查找重复项,按照所有Adam的输出(区分大小写顺序)对列表进行排序和重新排序 请注意,所有其他值保持不变.即‘A’、‘b’、‘C’、‘d’都保持在原来的位置

我能够进行标准的排序或编写复杂的代码来完成这项工作,但我正在寻找一些现有的优化机制,因为这个列表可能很大(数十亿条记录).因此效率至关重要

任何指向现有代码片段库的 idea 或指针都会有所帮助 先谢谢你.

推荐答案

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

Python相关问答推荐

如何随着收件箱的增加动态添加到HTML表的右下角?

单击Cookie横幅错误并在Selenium中启用搜索栏

有什么方法可以修复奇怪的y轴Python matplotlib图吗?

Pandas滚动分钟,来自其他列的相应值

Matplotlib轮廓线值似乎不对劲

如何将Matplotlib的fig.add_axes本地坐标与我的坐标关联起来?

Pydantic:如何将对象列表表示为dict(将列表序列化为dict)

数字梯度的意外值

如何使用没有Selenium的Python在百思买着陆页面上处理国家/地区 Select ?

将HLS纳入媒体包

如何根据日期和时间将状态更新为已过期或活动?

返回nxon矩阵的diag元素,而不使用for循环

试图找到Python方法来部分填充numpy数组

'discord.ext. commanders.cog没有属性监听器'

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

为什么抓取的HTML与浏览器判断的元素不同?

如何在Polars中从列表中的所有 struct 中 Select 字段?

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

如何指定列数据类型

合并与拼接并举