Python排序和排序——列表列表如何精确排序?
在Python中,排序列表的确切规则是什么 元素是列表吗?这可以表示为“键”或“cmp”吗 功能?问题来自于以下两个事实 要考虑:在其位置的长度和值 假设第二行将在第一行之前排序是否安全? 假设第三行排序总是最后一行,安全吗 注意,这与稳定性无关!上述具体情况表现为: 正如所描述的那样。但是,那里的规则是否可以考虑 一般吗?python在这里应用的确切规则是什么 根据以下定义(感谢Ashniwi): 为了比较不同长度的序列,需要使用较短的序列 通常在末尾填充足够的“空白”(一种特殊符号 被视为比A)的每个元素都小。这种比较方式 字典中总是使用不同长度的序列。 然而,在组合数学中,另一个约定经常被使用, 短序列总是比长序列小。 这种字典顺序的变体有时被称为shortlex 秩序 Python使用的是“shortlex order”。这一假设的证据在哪里,Python排序和排序——列表列表如何精确排序?,python,list,sorting,Python,List,Sorting,在Python中,排序列表的确切规则是什么 元素是列表吗?这可以表示为“键”或“cmp”吗 功能?问题来自于以下两个事实 要考虑:在其位置的长度和值 假设第二行将在第一行之前排序是否安全? 假设第三行排序总是最后一行,安全吗 注意,这与稳定性无关!上述具体情况表现为: 正如所描述的那样。但是,那里的规则是否可以考虑 一般吗?python在这里应用的确切规则是什么 根据以下定义(感谢Ashniwi): 为了比较不同长度的序列,需要使用较短的序列 通常在末尾填充足够的“空白”(一种特殊符号 被视为比
除了实际示例之外?默认情况下,
sorted
使用所比较项目的\ult\uuu
方法。根据Python文档,具有可比较元素的列表按字典顺序进行比较。因此,是的,该语言保证较短字符串的排序将先于较长字符串。引用自:
特别是,元组和列表是通过
比较相应的元素。这就是说,要比较平等,,
每个元素的比较必须相等,并且两个序列必须相同
相同的类型和长度
:
- 对于要比较相等的两个集合,它们必须具有相同的类型,具有相同的长度,并且每对对应的元素必须比较相等(例如,
为false,因为类型不同)[1,2]==(1,2)
- 支持顺序比较的集合的顺序与其第一个不等元素相同(例如,
您可以指定自己的规则,使用[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”,对吗。但是,如果默认行为是等效的,那么它可能会更有效率。您引用的文档中关于身份的评论不是按顺序的。@Frank ReneSchäfer docs没有在任何地方提到身份,身份与平等是不同的。根据文档,比较是按字典顺序进行的:给定两个相同长度的不同序列,a1a2…ak和b1b2…bk,如果ai@Frank-ReneSchäfer Mycmp
函数仅用于显示列表如何在内部进行比较,我从来没有说过应该在实际代码中使用它。不过,您可以使用它来查看是否得到与默认列表排序相同的输出。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; }