ما هي الحجج التي تتمتع بها وظيفة Python Sort ()؟
-
21-09-2019 - |
سؤال
هل هناك أي حجة أخرى غير key
, ، فمثلا: value
?
المحلول
حجج sort
و sorted
كلاهما sort
و sorted
لديك ثلاث وسيطات كلمات رئيسية: cmp
, key
و reverse
.
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
استخدام key
و reverse
مفضل ، لأنهم يعملون أسرع بكثير من ما يعادل cmp
.
key
يجب أن تكون دالة تأخذ عنصرًا وإرجاع قيمة للمقارنة والفرز. reverse
يسمح لعكس الترتيب الفرز.
استخدام key
جدال
يمكنك استخدام operator.itemgetter
كوسيطة رئيسية لفرزها في الثانية والثالثة وما إلى ذلك العنصر في tuple.
مثال
>>> from operator import itemgetter
>>> a = range(5)
>>> b = a[::-1]
>>> c = map(lambda x: chr(((x+3)%5)+97), a)
>>> sequence = zip(a,b,c)
# sort by first item in a tuple
>>> sorted(sequence, key = itemgetter(0))
[(0, 4, 'd'), (1, 3, 'e'), (2, 2, 'a'), (3, 1, 'b'), (4, 0, 'c')]
# sort by second item in a tuple
>>> sorted(sequence, key = itemgetter(1))
[(4, 0, 'c'), (3, 1, 'b'), (2, 2, 'a'), (1, 3, 'e'), (0, 4, 'd')]
# sort by third item in a tuple
>>> sorted(sequence, key = itemgetter(2))
[(2, 2, 'a'), (3, 1, 'b'), (4, 0, 'c'), (0, 4, 'd'), (1, 3, 'e')]
تفسير
يمكن أن تحتوي التسلسلات على أي كائنات ، ولا حتى قابلة للمقارنة ، ولكن إذا تمكنا من تحديد وظيفة تنتج شيئًا يمكننا مقارنته لكل عنصر من العناصر ، فيمكننا تمرير هذه الوظيفة key
حجة ل sort
أو sorted
.
itemgetter
, ، على وجه الخصوص ، يخلق هذه الوظيفة التي تجلب العنصر المحدد من معاملته. مثال من وثائقها:
بعد، بعدما،
f=itemgetter(2)
, ، الاتصالf(r)
عائداتr[2]
.
وصيفية صغيرة ، key
ضد cmp
فقط من باب الفضول، key
و cmp
الأداء مقارنة ، أصغر هو أفضل:
>>> from timeit import Timer
>>> Timer(stmt="sorted(xs,key=itemgetter(1))",setup="from operator import itemgetter;xs=range(100);xs=zip(xs,xs);").timeit(300000)
6.7079150676727295
>>> Timer(stmt="sorted(xs,key=lambda x:x[1])",setup="xs=range(100);xs=zip(xs,xs);").timeit(300000)
11.609490871429443
>>> Timer(stmt="sorted(xs,cmp=lambda a,b: cmp(a[1],b[1]))",setup="xs=range(100);xs=zip(xs,xs);").timeit(300000)
22.335839986801147
لذلك ، الفرز مع key
يبدو أن على الأقل ضعف السرعة مع الفرز cmp
. استخدام itemgetter
بدلاً من lambda x: x[1]
يجعل الفرز أسرع.
نصائح أخرى
بجانب key=
, ، ال sort
طريقة القوائم في Python 2.x يمكن بدلاً من ذلك أن تأخذ ملف cmp=
جدال (ليس فكرة جيدة ، تمت إزالتها في بيثون 3) ؛ مع أي من هذين أو لا شيء من هذين ، يمكنك دائمًا المرور reverse=True
للحصول على الفرز لأسفل (بدلاً من الأعلى كما هو الافتراضي ، والتي يمكنك أيضًا طلبها بشكل صريح reverse=False
إذا كنت حريصًا حقًا على القيام بذلك لسبب ما). ليس لدي أي فكرة عن ذلك value
الحجة التي تذكرها من المفترض أن تفعل.
نعم ، يتطلب الأمر حججًا أخرى ، لكن لا value
.
>>> print list.sort.__doc__
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1
ماذا يمكن value
الحجة يعني حتى؟