gpt4 book ai didi

python - 在 Python 3 中查找唯一不可散列的不可排序类型的最佳方法是什么

转载 作者:太空狗 更新时间:2023-10-30 02:32:53 25 4
gpt4 key购买 nike

所以在 Python 2 中你可以使用类似的东西

>>> items = [[1, 2], [3], [3], 4, 'a', 'b', 'a']
>>> from itertools import groupby
>>> [k for k, g in groupby(sorted(items))]
[4, [1, 2], [3], 'a', 'b']

效果很好,在 O(N log N) 中时间。然而 Python 3 惊呼 TypeError: unorderable types: int() < list() .那么在 Python 3 中最好的方法是什么? (我知道最好的是一个主观术语,但实际上应该有一种根据 Python 来做的方法)

编辑:它不必使用排序,但我猜那将是最好的方法

最佳答案

在 2.x 中,两个不可比较的内置类型的值按类型排序。类型的顺序没有定义,只是在一次解释器运行期间它会保持一致。所以,2 < [2]可能是真或假,但始终是真或假。

在 3.x 中,不可比较的内置类型的值是不可比较的——这意味着它们会引发 TypeError如果您尝试比较它们。所以,2 < [2]是一个错误。而且,至少从 3.3 开始,类型本身甚至不可比。但是如果你只想重现 2.x 的行为,他们的 id s 绝对是可比较的,并且在解释器运行期间是一致的。所以:

sorted(items, key=lambda x: (id(type(x)), x))

对于您的用例,这就是您所需要的。


但是,这与 2.x 所做的并不完全相同,因为它意味着,例如,1.5 < 2可能是 False (因为 float > int )。如果你想复制确切的行为,你需要编写一个关键函数,首先尝试比较值,然后在 TypeError 上回过头来比较类型。

这是少数几个使用旧式 cmp 的案例之一函数比新式 key 更容易阅读函数,所以让我们编写其中一个,然后使用 cmp_to_key 在上面:

def cmp2x(a, b):
try:
if a==b: return 0
elif a<b: return -1
elif b<a: return 1
except TypeError:
pass
return cmp2x(id(type(a)), id(type(b)))
sorted(items, key=functools.cmp_to_key(cmp2x))

这仍然不能保证 2.x 给出的不同类型的两个值之间的顺序相同,但是由于 2.x 没有定义任何这样的顺序(只是它在一次运行中是一致的),所以没有办法可以。

然而,仍然存在一个真正的缺陷:如果您定义一个对象未​​完全排序的类,它们将最终排序为相等的,我不确定这是否与 2.x 中的相同那种情况。

关于python - 在 Python 3 中查找唯一不可散列的不可排序类型的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16014370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com