Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';It’在Python3中找到唯一的不可破坏的无序类型的最佳方法是什么_Python_Python 3.x - Fatal编程技术网

什么';It’在Python3中找到唯一的不可破坏的无序类型的最佳方法是什么

什么';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()

所以在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()
。那么在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)