什么';It’在Python3中找到唯一的不可破坏的无序类型的最佳方法是什么
所以在Python2中,可以使用什么';It’在Python3中找到唯一的不可破坏的无序类型的最佳方法是什么,python,python-3.x,Python,Python 3.x,所以在Python2中,可以使用 >>> 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 logn)time中,它工作得很好。然而,Python3惊呼类型错误:无序类型:int()
>>> 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 logn)
time中,它工作得很好。然而,Python3惊呼类型错误:无序类型:int()
。那么在Python3中最好的方法是什么呢?(我知道best是一个主观的术语,但实际上根据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
函数更易于阅读,因此让我们编写其中一种,然后在其上使用:
def cmp2x(a、b):
尝试:
如果a==b:返回0
elif a让我们后退一步
您想将集合进行统一
如果这些值是可散列的,则使用O(N)set
解决方案。但事实并非如此。如果你能想出某种散列函数,你可以等价地使用myhash(value):value的dict
。如果您的用例真的是“除了可散列值和可散列值的平面列表”,您可以通过尝试到散列,然后返回到散列(tuple())
来做到这一点。但总的来说,这是行不通的
如果它们是完全排序的,您将使用O(N logn)排序的
解决方案(或等效的基于树的解决方案或类似方案)。如果你能想出某种完整的排序函数,你可以把一个键
传递给排序的
函数。我认为这将在您的用例中起作用(因此我的另一个答案)。但是,如果不是这样,就不会有O(N logn)解决方案起作用
如果两者都不是,您可以回到O(N**2)线性搜索解决方案:
unique = []
for value in items:
if value not in unique:
unique.append(value)
如果您无法找到某种方法来定义值的完整排序或散列函数,这是您所能做的最好的方法。这些列表不是元组吗?@JakobBowyer请原谅我没有想出更好的示例,为了这个问题和它的标题,让我们说它们不能t@JakobBowyer:那没有任何帮助;然后他会得到一个关于int
和tuple
不可排序的错误。@user2282357:为什么要在这里添加groupby
复杂性?错误出现在已排序(项目)
;“你不需要更多的东西了。”阿巴内特:我不太明白。这只是一种获得独特元素的方法。我还不是python专家,但是,字典不应该解决这类问题吗{“key”:value,…}
@user2244984:我不确定字典如何解决与原始问题相关的任何问题。集合会……但整个问题是这些值不可散列,这意味着它们不能与集合或字典一起使用。好的,我需要一个不可散列的定义,因为这是我第一次读到这个术语:什么是不可散列的?@abarnert你的第一个例子给了我:TypeError:unorderable types:type()
,第二个似乎有效,排序与Python 2不同,如果您尝试使用列表中的3.3
和4.4
,但这不是我的问题,所以我想这很好。从技术上讲,任何不定义\uuuuuuuuuuuuuuuuuuuuuuuuu散列
的对象,或其\uuuuuuuuuuuuuuuuuuuuuuuucode>的对象都会引发类型错误,是不可散列的。(实际上,如果它引发任何其他类型的错误,它仍然是不可散列的。)
unique = []
for value in items:
if value not in unique:
unique.append(value)