Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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
为什么int(50)<;python2.x中的str(5)?_Python_Comparison_Int_Python 2.x_String - Fatal编程技术网

为什么int(50)<;python2.x中的str(5)?

为什么int(50)<;python2.x中的str(5)?,python,comparison,int,python-2.x,string,Python,Comparison,Int,Python 2.x,String,在Python3中,int(50)它的工作原理如下1 不过,您可能指的是这些类型的值,在这种情况下,数值比较适用 1这些都是在Python 2.6.5上完成的 谢谢克朗帮我澄清了这件事。我以前从未想过将一个数字与一个dict进行比较,数字的比较是如此明显以至于很容易被忽视的事情之一。(谁认为从这个开始是个好主意??) 我可以想象,原因可能是允许不同类型的对象存储在树状结构中,树状结构内部使用比较。允许这些比较的原因是排序。Python2.x可以对包含混合类型(包括字符串和整数)的列表进行排序——

在Python3中,
int(50)它的工作原理如下1

不过,您可能指的是这些类型的值,在这种情况下,数值比较适用

1这些都是在Python 2.6.5上完成的

谢谢克朗帮我澄清了这件事。我以前从未想过将一个数字与一个dict进行比较,数字的比较是如此明显以至于很容易被忽视的事情之一。

(谁认为从这个开始是个好主意??)


我可以想象,原因可能是允许不同类型的对象存储在树状结构中,树状结构内部使用比较。

允许这些比较的原因是排序。Python2.x可以对包含混合类型(包括字符串和整数)的列表进行排序——整数总是首先出现。Python3.x不允许这样做,原因正是您指出的

Python2.x:

>>> sorted([1, '1'])
[1, '1']
>>> sorted([1, '1', 2, '2'])
[1, 2, '1', '2']
Python3.x:

>>> sorted([1, '1'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() < int()
已排序([1,'1']) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:无序类型:str()
正如亚伦所说。将其分解为您的要点:

  • 因为它使sort做了一件半途而废的事情,否则它将毫无意义(混合列表)。一般来说,这不是一个好主意,但Python中的许多内容都是为了方便而不是严格而设计的
  • 按类型名称排序。这意味着相同类型的事物可以组合在一起,在这里它们可以被排序。它们可能应该按类型类分组,例如按数字分组,但没有合适的类型类框架。这里可能有一些更具体的规则(可能是数字类型的规则),我必须检查源代码
  • 一个是字符串,另一个是unicode。然而,它们可能有一个直接的比较操作,但可以想象,不可比较的类型会在它们之间分组,造成混乱。我不知道是否有代码可以避免这种情况
  • 因此,在一般情况下,这是没有意义的,但偶尔会有帮助

    from random import shuffle
    letters=list('abcdefgh')
    ints=range(8)
    both=ints+letters
    shuffle(ints)
    shuffle(letters)
    shuffle(both)
    print sorted(ints+letters)
    print sorted(both)
    
    两者都先打印整数,然后打印字母


    作为一项规则,您不希望在程序中随机混合类型,显然,如果Python 2试图在不存在类型的情况下含糊其辞,则Python 3会阻止这种混合。如果您真的愿意,您仍然可以按lambda,b:cmp(repr(a),repr(b))(或更好的方式)排序,但语言开发人员似乎同意这是不切实际的默认行为。我希望它会有所不同,这不会让人感到意外,但在Python2意义上检测问题要困难得多。

    相关问题:Python doc->With dictionary,如果您需要用于实现O(log N)搜索的比较函数,并且希望能够混合键类型,那么,显而易见的答案是,您需要进行比较,以适用于任何值的组合。如果他们认为在Python3中使用
    id
    会更好,我也不会感到惊讶。无论是谁,只要找到此更改的PEP(可能在3000范围内),都可以获得道具。@Mike:Python的字典在内部使用哈希表,而不是树,所以这不是原因。“为什么”!?!在Python2中是允许的,因为开发人员认为这是一个好主意,但事实并非如此,因此在Python3中得到了认可。这就是为什么。。。是的,我的意思是,这完全符合逻辑,不是吗?Re:
    No。字符串和unicode对象在这方面被认为是相同的。试试看。
    我做过,但总有可能我的测试遗漏了什么
    (int@kRON.“上一次修订是
    True
    ”是什么意思我从来没有贴过。你吸毒吗?任何人都可以查看我的编辑记录。事实上,我从来没有将
    True
    与这些记录进行过比较,因为它是
    int
    。我运行过许多执行块,容器类型的字母顺序是一个众所周知的现象。对不起,错过了我的早茶。你知道
    float()如果我错了,请纠正我的错误,但AFAIK Python没有任何内部使用树的内置数据类型。dict、set、ORDERDEDDICT等都是作为哈希表实现的。由于Python允许异构集合,因此也可能更容易允许对它们进行排序。虽然Python 3简化了比较规则,但从概念上讲,我认为这会使比较复杂它允许对列表的一个实例进行排序,但不允许对另一个实例进行排序。嗯,排序是因为它允许比较,而不是相反。OP问Python为什么允许这样做。我是说,为什么这些比较首先被允许,原因是排序。一个公平的观点是,它可能在一开始就激发了它。现在你当然可以使用key=对异类列表进行排序。在这一个列表上进行有趣的投票洗牌。它确实没有增加多少,但我很高兴它以相同的速度获得上下选票。
    
    >>> sorted([1, '1'])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unorderable types: str() < int()
    
    from random import shuffle
    letters=list('abcdefgh')
    ints=range(8)
    both=ints+letters
    shuffle(ints)
    shuffle(letters)
    shuffle(both)
    print sorted(ints+letters)
    print sorted(both)