这实际上可能是一个荒谬的请求,我会在询问后解释!
我在这样的脚本中加载了一个列表:
PROPERTIES = list(set().union(*[n.properties for n in NETWORKS])) # random order
我使用 set() 函数来避免对同一个 Property 对象计数两次(Property 是我之前定义的类,它与 python 自己的 'property' 关键字无关)。 现在,因为集合是无序的,所以当我将它转换为列表时,每次加载它时生成的 PROPERTIES 可能会以不同的顺序出现。
当我访问列表中的一个对象时,它会读取类似“< ...object at 0x103098550>”的内容,其中 0x103098550 是加载对象的内部内存。
我的问题如下:有没有一种方法可以将列表按内存位置的升序排序,这样每次加载时 PROPERTIES 的顺序都相同?
请注意,NETWORKS 的顺序始终相同,没有随机性。唯一可能的随机性是在调用 set() 函数时。
如果位置是用这行代码本身动态生成的,这可能是一个愚蠢的问题。
编辑:注释。我并不是要求每次加载它时内存位置都相同(我知道这与我的整个计算机有关,也可能是随机的),但也许是内存的顺序每次我加载它时,对象 n.properties 都是一样的。毕竟,当我构建/加载 NETWORKS 时,我总是以相同的顺序加载其中的每个网络,并且大概分配的内存位置将单调下降(或上升?我不记得堆是如何工作的)。
最佳答案
依赖于内存位置——这不能保证是单调的(Python 运行时处理它自己的内存池并且经常重用已经分配的内存)——肯定不会以可靠的方式工作(它可以看起来 有时会工作 - 特别是在快速测试脚本中 - 但你可以将其视为意外)。
一个更简单的解决方案(假设您的属性对象是可散列的)是使用具有虚拟值的 collections.OrderedDict
:
from collections import OrderedDict
PROPERTIES = list(OrderedDict(n.properties, None) for n in NETWORKS))
此解决方案保证有效。
关于python - 我可以按内存位置对 python 中的列表元素进行排序(排序)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48500764/