Python排序和排序——列表列表如何精确排序?

Python排序和排序——列表列表如何精确排序?,python,list,sorting,Python,List,Sorting,在Python中,排序列表的确切规则是什么 元素是列表吗?这可以表示为“键”或“cmp”吗 功能?问题来自于以下两个事实 要考虑:在其位置的长度和值 假设第二行将在第一行之前排序是否安全? 假设第三行排序总是最后一行,安全吗 注意,这与稳定性无关!上述具体情况表现为: 正如所描述的那样。但是,那里的规则是否可以考虑 一般吗?python在这里应用的确切规则是什么 根据以下定义(感谢Ashniwi): 为了比较不同长度的序列,需要使用较短的序列 通常在末尾填充足够的“空白”(一种特殊符号 被视为比

在Python中,排序列表的确切规则是什么 元素是列表吗?这可以表示为“键”或“cmp”吗 功能?问题来自于以下两个事实 要考虑:在其位置的长度和值

假设第二行将在第一行之前排序是否安全? 假设第三行排序总是最后一行,安全吗

注意,这与稳定性无关!上述具体情况表现为: 正如所描述的那样。但是,那里的规则是否可以考虑 一般吗?python在这里应用的确切规则是什么

根据以下定义(感谢Ashniwi):

为了比较不同长度的序列,需要使用较短的序列 通常在末尾填充足够的“空白”(一种特殊符号 被视为比A)的每个元素都小。这种比较方式 字典中总是使用不同长度的序列。 然而,在组合数学中,另一个约定经常被使用, 短序列总是比长序列小。 这种字典顺序的变体有时被称为shortlex 秩序

Python使用的是“shortlex order”。这一假设的证据在哪里,
除了实际示例之外?

默认情况下,
sorted
使用所比较项目的
\ult\uuu
方法。根据Python文档,具有可比较元素的列表按字典顺序进行比较。因此,是的,该语言保证较短字符串的排序将先于较长字符串。

引用自:

特别是,元组和列表是通过 比较相应的元素。这就是说,要比较平等,, 每个元素的比较必须相等,并且两个序列必须相同 相同的类型和长度

:

  • 对于要比较相等的两个集合,它们必须具有相同的类型,具有相同的长度,并且每对对应的元素必须比较相等(例如,
    [1,2]==(1,2)
    为false,因为类型不同)
  • 支持顺序比较的集合的顺序与其第一个不等元素相同(例如,
    [1,2,x]ob_item[i],Py_EQ);
    if(k<0)
    返回NULL;
    如果(!k)
    打破
    }
    如果(i>=Py_尺寸(vl)|i>=Py_尺寸(wl)){
    /*没有更多要比较的项目--比较大小*/
    Py_-ssize_-t vs=Py_尺寸(vl);
    Py_ssize_t ws=Py_尺寸(wl);
    int-cmp;
    PyObject*res;
    开关(op){
    案例Py_LT:cmp=vs=ws;中断;
    默认值:返回NULL;/*不能发生*/
    }
    如果(cmp)
    res=Py_-True;
    其他的
    res=Py_假;
    Py_增量(res);
    返回res;
    }
    
    您可以指定自己的规则,使用
    sorted
    list.sort
    中的
    关键字参数对列表中的列表进行排序。参数的值是一个函数,它接受单个参数(列表中的每个元素)并返回每个元素的排序值。您可以使用
    len
    作为
    按列表中列表的长度排序。我想是这样的。。。这是默认的列表排序,即按字典顺序。可能会有默认值,但最好在可能的情况下指定排序参数(以防将来发布默认更改)。参考斯塔迈尔的评论。@chickenfeets虽然我大体上同意你的评论,但我怀疑这样一个公认的违约行为是否会改变。。。或者,如果你是那种偏执狂,你也应该重新定义整数的顺序,以防以后的版本决定-3>7…:)我认为你的回答是最合乎逻辑的。然而,我很难找到证据证明这一点。“你能详细说明一下吗?”弗兰克·雷内舍弗如是说?您可以将函数与Python2的排序函数一起使用
    cmp
    参数可用。可以使用您的“cmp”,对吗。但是,如果默认行为是等效的,那么它可能会更有效率。您引用的文档中关于身份的评论不是按顺序的。@Frank ReneSchäfer docs没有在任何地方提到身份,身份与平等是不同的。根据文档,比较是按字典顺序进行的:给定两个相同长度的不同序列,a1a2…ak和b1b2…bk,如果ai@Frank-ReneSchäfer My
    cmp
    函数仅用于显示列表如何在内部进行比较,我从来没有说过应该在实际代码中使用它。不过,您可以使用它来查看是否得到与默认列表排序相同的输出。
    sorted([
       [ 0, 1, 2, 3 ],  # 1st line: longer list
       [ 0, 1 ],        # 2nd line: shorter list
       [ 0, 2 ]         # 3rd line: suspected last
    ])
    
    def cmp(list_1, list_2):
        length_1 = len(list_1)
        length_2 = len(list_2)
        min_length = min(length_1, length_2)
    
        # Compare individual items till there's a different item found
        for i in xrange(min_length):
            if list_1[i] > list_2[i]:
                return 1
            elif list_1[i] < list_2[i]:
                return -1
    
        # All items were same so far, let's compare sizes.
        if length_1 > length_2:
            return 1
        elif length_1 < length_2:
            return -1
        elif length_1 == length_2:
            return 0
    
    >>> lst = [[ 0, 1, 2, 3 ], [ 0, 1 ], [ 0, 2 ]]
    >>> print sorted(lst) == sorted(lst, cmp=cmp)
    True
    
    /* Search for the first index where items are different */
    for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
        int k = PyObject_RichCompareBool(vl->ob_item[i],
                                         wl->ob_item[i], Py_EQ);
        if (k < 0)
            return NULL;
        if (!k)
            break;
    }
    
    if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
        /* No more items to compare -- compare sizes */
        Py_ssize_t vs = Py_SIZE(vl);
        Py_ssize_t ws = Py_SIZE(wl);
        int cmp;
        PyObject *res;
        switch (op) {
        case Py_LT: cmp = vs <  ws; break;
        case Py_LE: cmp = vs <= ws; break;
        case Py_EQ: cmp = vs == ws; break;
        case Py_NE: cmp = vs != ws; break;
        case Py_GT: cmp = vs >  ws; break;
        case Py_GE: cmp = vs >= ws; break;
        default: return NULL; /* cannot happen */
        }
        if (cmp)
            res = Py_True;
        else
            res = Py_False;
        Py_INCREF(res);
        return res;
    }