سؤال

هل هناك أي حجة أخرى غير 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 الحجة يعني حتى؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top