【问题标题】:Can I sort (order) list elements in python by by memory location?我可以按内存位置对python中的列表元素进行排序(排序)吗?
【发布时间】:2018-07-08 02:51:44
【问题描述】:

这实际上可能是一个无意义的请求,我会在我问过之后解释!

我在这样的脚本中加载了一个列表:

PROPERTIES = list(set().union(*[n.properties for n in NETWORKS]))  # random order

我使用 set() 函数来避免两次计算同一个 Property 对象(Property 是我之前定义的一个类,它与 python 自己的“property”关键字无关)。 现在,因为集合是无序的,所以当我将其转换为列表时,每次加载时生成的 PROPERTIES 可能会以不同的顺序出现。

当我访问列表中的对象时,它会读取类似“”的内容,其中 0x103098550 是加载的对象的内部存储器。

我的问题如下:有没有办法将列表排序为内存位置的升序,这样每次加载时 PROPERTIES 的顺序都相同?

请注意,NETWORKS 的顺序始终相同,没有随机性。唯一可能的随机性是调用 set() 函数的时间。

如果位置是使用这行代码本身动态生成的,这可能是一个愚蠢的问题。

编辑:注意。我并不是要求每次加载时内存位置都相同(我知道这与我的整个计算机有关,也可能是随机的),但可能是内存的 ordering每次我加载它时,对象 n.properties 都是相同的。毕竟,当我构建/加载 NETWORKS 时,我总是以相同的顺序加载其中的每个网络,并且大概分配的内存位置会单调下降(或上升?我不记得堆是如何工作的)。

【问题讨论】:

  • 正如您在问题本身(“无意义的请求”)中所说,为什么需要这样做? (这可能是 XY 问题)
  • 虽然我不确定这是否是 XY 问题,或者这是否是您面临的正确原始问题,但是:[如果您试图获得“任何一致的排序”,请使用哈希。]
  • 内存位置也是随机的。按它们排序是没有意义的。
  • 感谢 user202729!我实际上并不知道 XY 问题是什么,我想这与错误引用某个对象有关?无论如何,我相信 schwobaseggl 提供了我正在寻找的答案。
  • 虽然 schwobaseggl 准确回答了“如何按内存位置对对象进行排序”的问题,但它实际上并没有解决您的真正问题,即“如何在保留顺序的同时对列表进行重复数据删除”。确实是典型的 XY 问题:你问的是你想象的解决方案,而不是问你的真实问题。

标签: python python-3.x list sorting memory


【解决方案1】:

依赖内存位置 - 这并不保证是单调的(Python 运行时处理它自己的内存池并且经常重用已分配的内存) - 肯定不会以可靠的方式工作(它可能 似乎 有时可以工作 - 特别是在快速测试脚本中 - 但您可以将其视为意外)。

一个更简单的解决方案(假设您的属性对象是可散列的)是使用带有虚拟值的collections.OrderedDict

from collections import OrderedDict
PROPERTIES = list(OrderedDict(n.properties, None) for n in NETWORKS))

此解决方案保证有效。

【讨论】:

    【解决方案2】:

    通过id 函数检索任何对象的内存位置。所以你可以这样做:

    sorted(PROPERTIES, key=id)
    

    【讨论】:

    • “康拉德官僚,你在技术上是正确的——最好的正确。我在此将你提升到 37 年级。”
    • @gregory-fen:这确实是您问题的技术准确答案 - 但正如 Rawing 在评论中提到的那样,内存位置绝不是单调的 - 他们可能 i> 有时是有时不是 -,所以你最好不要依赖这个。
    • 回答提出的问题,但实际上并不能满足 OP 的需求。 OP,不要这样做。
    • 值得一提的是,id 函数不一定返回对象的内存地址——这是一个 CPython 实现细节。换句话说,按内存位置排序是 python-the-language 甚至不支持的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2018-03-08
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多