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

时间:2017-07-06 06:34:56

标签: python list sorting

Python中使用的准确规则是什么? 元素是列表?这可以表达为“关键”'或者' cmp' 功能?问题来自于有两件事 考虑:长度位置的值

sorted([
   [ 0, 1, 2, 3 ],  # 1st line: longer list
   [ 0, 1 ],        # 2nd line: shorter list
   [ 0, 2 ]         # 3rd line: suspected last
])

假设第二行在第一行之前排序是否安全? 假设第三行将排序总是持续是否安全?

注意,不是关于稳定性!上面的具体情况表现 就像所描述的那样。但是,可以考虑那些规则 一般吗? python在这里适用的准确规则是什么?

依赖以下定义Lexicographical Order(感谢Ashniwi):

  

为了比较不同长度的序列,较短的序列是   通常用足够的空白填充#34;空白" (一个特殊的符号   被视为小于A)的每个元素。这种比较方式   字典中总是使用不同长度的序列。   然而,在组合学中,经常使用另一种惯例,   因此,较短的序列总是小于较长的序列。   这种词典顺序的变体有时被称为短语   顺序。

Python是否使用' 短信订单'。这种假设的证明在哪里, 超越实际的例子?

2 个答案:

答案 0 :(得分:5)

默认情况下,<asp:RadioButtonList ID="userImpect" runat="server" ForeColor="Black" RepeatDirection="Horizontal"> <asp:ListItem Text="Just me" Value="Just me"></asp:ListItem> <asp:ListItem Text="Multiple Users" Value="Multiple Users"></asp:ListItem> <asp:ListItem Text="Everyone" Value="Everyone"></asp:ListItem> </asp:RadioButtonList> <asp:CustomValidator ID="CustomValidator2" runat="server" ErrorMessage="Required" ClientValidationFunction="checkRadioList"></asp:CustomValidator> <script type="text/javascript"> function checkRadioList(oSrc, args) { var a = document.getElementById('<%=userImpect.ClientID %>').style; if ($("input[name='<%= userImpect.UniqueID %>']:checked").val() == null) { args.IsValid = false; a.backgroundColor = "#ffff00"; } else { args.IsValid = true; a.backgroundColor = "#ffffff"; } } </script> 使用所比较项目的sorted方法。根据Python文档,具有可比元素的列表按字典顺序进行比较。所以,是的,语言保证在较短的字符串中将在较长的字符串之前进行排序。

答案 1 :(得分:2)

引自docs

  

特别是,元组和列表按字典顺序进行比较   比较相应的元素。这意味着要比较平等,   每个元素必须比较相等,两个序列必须是   相同类型,长度相同。

Lexicographical comparison between built-in collections works as follows

  • 对于要比较的两个集合相等,它们必须是相同的类型,具有相同的长度,并且每对相应的元素必须相等(例如,[1,2] == (1,2)为false,因为类型不同)。
  • 支持订单比较的集合的排序与其第一个不相等的元素相同(例如,[1,2,x] <= [1,2,y]x <= y具有相同的值)。如果不存在相应的元素,则首先排序较短的集合(例如,[1,2] < [1,2,3]为真)。

可以使用此函数表示对列表进行的基本比较:

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

相关CPython code for reference

/* 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;
}