如何对不同类型的列表进行排序?

2024-07-04

我需要使用 python 3 对列表进行排序。可能有strings, integers, floats, or tuples, etc.

我目前正在尝试正确使用sort函数使用key参数如下:

data.sort(key=gen_key)

...

def gen_key(self, value):
        if is_number(value):
            return str(value)

        if isinstance(value, str):
            return value
    return '___' + type(value).__name__

但问题是数字现在会自然排序。虽然我想对数字和浮点数进行排序,但仍然像数字和浮点数一样,而不是将它们视为字符串。

该行为是由return str(value)部分。但我不能返回与字符串不同的类型,因为这会引发异常,因为 python 3 字符串不会像 python 2 中那样用数字排序。异常如下

unordarable types: int() < str()

有什么建议么?


诀窍是让你的key函数返回一个元组,该元组在第一个索引中具有保证的可比较类型,在后续索引中具有不同的类型。

虽然与 Python 2 的做法并不 100% 相同,但对于“数字在前面,其他所有内容按类型名进行比较”的特定情况,您可以使用相当有效的方法来完成此操作key功能:

>>> from numbers import Number
>>> seq = ['Z', 3, 'Y', 1, 'X', 2.5, False, (1, 2), [2, 3], None]
>>> sorted(seq, key=lambda x: (x is not None, '' if isinstance(x, Number) else type(x).__name__, x))
[None, False, 1, 2.5, 3, [2, 3], 'X', 'Y', 'Z', (1, 2)]

The key这里的函数使第一个元素key一个简单的bool, 强迫None在其他所有内容之前进行排序(Py2 做了同样的事情),然后首先使用键的第二部分的空字符串对所有数字类型进行排序,其他所有内容都使用它们的类型名称(也像 Py2 一样)。一旦你超越了前两个索引,剩下的就是相同的类型,并且应该可以很好地进行比较。

这里的主要缺陷是类似的非数字类型set and frozenset不会相互比较,它们将仅按类型名称排序(使用异常的自定义键类可以处理此问题)。

它也不会处理递归情况;如果序列包含[2, 3] and ['a', 'b'],它将有一个TypeError比较2 with 'a',但是只有一个可笑的关键类才能处理这个问题。

如果这不是问题,那么运行起来很便宜并且相对简单。

与涉及自定义类的解决方案不同__lt__定义来执行比较,此方法的优点是生成内置键,可以在排序期间以最少的 Python 级代码执行进行有效比较。

Timings:

 # Multiply out the sequence so log n factor in n log n work counts for something
 >>> seq = ['Z', 3, 'Y', 1, 'X', 2.5, False, (1, 2), [2, 3], None] * 100

 # Verify equivalence
 >>> sorted(seq, key=Py2Key) == sorted(seq, key=lambda x: (x is not None, '' if isinstance(x, Number) else type(x).__name__, x))
 True

 # Timings in seconds for the fastest time (of 3 trials) to run the sort 1000 times:
 >>> import timeit

 # Py2Key class
 >>> min(timeit.repeat('sorted(seq, key=Py2Key)', 'from __main__ import seq, Py2Key', number=1000))
 5.251885865057375

 >>> min(timeit.repeat('sorted(seq, key=lambda x: (x is not None, "" if isinstance(x, Number) else type(x).__name__, x))', 'from __main__ import seq, Number', number=1000))
 1.9556877178131344

基本上,避免了动态Python级别的开销__lt__运行时间缩短了 60% 以上。这似乎不是算法的改进(aseq100 倍长具有相同的运行时间比),只是固定开销的减少,但这是一个不平凡的减少。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对不同类型的列表进行排序? 的相关文章

  • 使用 Keras RNN 模型使用较少时间步长(不同维度)的数据进行预测

    根据RNN的性质 我们可以得到每个时间戳 时间展开 的预测概率的输出 假设我训练一个具有 5 个时间步长的 RNN 每个时间步长有 6 个特征 因此我必须像这样指定第一层 假设我们使用具有 20 个节点的 LSTM 层作为第一层 model
  • 如何在 Visual Studio 2017 中更新 Django

    我正在尝试设置 Visual Studio 2017 进行 Django 开发 但 Django 1 9 版本很旧 如何将其更新到最新版本 gt 2 0 使用建议的安装创建 Django Web 项目 为您的环境命名 选择 Python环境
  • python 中的神经网络:决策/分类总是给出 0.5

    首先我想说我是一个Python初学者 对神经网络也是完全陌生的 当我读到它时 我非常兴奋 并认为我从头开始设置了一些代码 参见下面的代码 但不知怎的 我的代码无法正常工作 我猜想存在一些重大错误 在算法和编程中 但我现在找不到他们 所以 在
  • ipython:如何设置终端宽度

    当我使用ipython terminal并想要打印一个numpy ndarray它有很多列 行会在大约 80 个字符处自动断行 即行的宽度为 cca 80 个字符 z zeros 2 20 print z 据推测 ipython 预计我的终
  • 从子列表中切片元素 - Python

    我想从中返回数字 5 list 1 1 2 3 4 5 6 我以为这会起作用 但事实并非如此 print list 1 1 1 它返回一个空列表 它是索引 1 第二个列表 和位置 1 列表中的第二个数字 这不应该起作用吗 您需要两个单独的操
  • 使用 Python 在 Yandex Images 中反向搜索图像

    我对自动化反向图像搜索感兴趣 Yandex 特别适合捕捞鲶鱼 甚至比 Google 图片还要好 因此 请考虑以下 Python 代码 import requests import webbrowser try filePath C path
  • 获取pygame中图像各个像素的颜色

    如何获取传输到 pygame 表面的图像像素的颜色值 使用 Surface get at 仅返回表面层的颜色 而不返回其上位图传输的图像 方法surface get at很好 下面的示例显示了在没有 Alpha 通道的情况下位图传输图像时的
  • 熊猫读_csv。如何忽略换行符之前的分隔符

    我正在读取一个包含数值的文件 data pd read csv data dat sep header None 在文本文件中 每行以空格结尾 因此 pandas 等待不存在的值 并在每行末尾添加一个 nan 例如 2 343 4 234
  • 如何覆盖 nltk 的 pos_tag 分配给文本的 POS 标签?

    我使用 nltk 中的 pos tag 来标记一组 未标记的 技术文档中的文本并获得良好的结果 但它总是将 authenticated 等单词标记为动词 而有时它可以用作形容词 换句话说 仅仅改变标签并不是每次都有效 是否有一个好方法来覆盖
  • 将分层(树状)XML 读入 pandas 数据帧,保留层次结构

    我有一个 XML 文档 其中包含分层的树状结构 请参阅下面的示例 该文档包含几个
  • BeautifulSoup 3.1 解析器太容易崩溃

    我在使用 BeautifulSoup 解析一些不可靠的 HTML 时遇到了麻烦 事实证明 新版本中使用的 HTMLParser 的容忍度低于以前使用的 SGMLParser BeautifulSoup 有某种调试模式吗 我正在尝试找出如何阻
  • 如何对不同类型的列表进行排序?

    我需要使用 python 3 对列表进行排序 可能有strings integers floats or tuples etc 我目前正在尝试正确使用sort函数使用key参数如下 data sort key gen key def gen
  • 相对于当前日期对 Java 集合进行排序

    我想相对于当前日期对日期列表进行排序 例如列表中有下一项 10 01 2018 10 20 2018 10 14 2018 10 02 2018 当前日期是10 08 2018 结果应该是按下一个顺序升序排列的数组 10 14 2018 1
  • ValueError:在 ECB 模式下数据必须与块边界对齐

    我正在使用以下代码在 ECB 模式下尝试 aes 128 加密 from Crypto Cipher import AES key abcdefghijklmnop cipher AES new key encode utf8 AES MO
  • OpenCV 图像处理——C++、C、Python

    我正在考虑在一个项目中尝试 OpenCV 并注意到它有 C C 和 Python 我正在尝试确定是否应该使用 C C 还是 Python 并且希望使用具有最佳 OpenCV 支持的任何语言 仅从查看各种文档的索引页来看 C 绑定可能比其他绑
  • 在 cmd.Cmd 命令行解释器中更好地处理键盘中断

    在使用 python 的 cmd Command 创建自定义 CLI 时 如何告诉处理程序中止当前行并给我一个新的提示 这是一个最小的例子 console min py run python console min py import cm
  • Rails 3 使用 NOT NULL 在 .where 条件之后排序

    我有一个显示最快用户的排名 users User find sort a b b finished at lt gt a created at 现在我必须添加一些代码以防止由于finished at beeing而出现错误nil直到用户完成
  • 获取矩阵中总和值最大的列

    比方说 import numpy as np f np matrix 1 2 3 4 5 6 是否可以从矩阵中检索具有最大列和的列数 如何 你可以写 gt gt gt f sum axis 0 argmax 1 所以专栏1求和到最大的值 为
  • 在Python中返回外部函数错误

    这就是问题 给定以下 Python 程序 假设用户从键盘输入数字 4 返回的值是多少 N int input enter a positive integer counter 1 while N gt 0 counter counter N
  • 使用 M1 Mac 进行 Python 多处理

    我有一台 Mac Mac Os 11 1 Python Ver 3 8 2 需要在多处理中工作 但程序不起作用 import multiprocessing def func index int print index manager mu

随机推荐