2010-07-09 10 views
37

मैं मनमानी फ़ंक्शन द्वारा वर्णित कुंजी द्वारा सूची को कैसे क्रमबद्ध कर सकता हूं? उदाहरण के लिए, अगर मेरे पास है:मनमाने ढंग से लैम्ब्डा द्वारा छंटनी

mylist = [["quux", 1, "a"], ["bar", 0, "b"]] 

मैं प्रत्येक सदस्य, उदा का दूसरा तत्व द्वारा "MyList" क्रमित करना चाहते हैं

sort(mylist, key=lambda x: x[1]) 

मैं यह कैसे कर सकता हूं?

+0

आपके द्वारा प्रदान किए गए कोड को आजमाने का क्या मुद्दा था? – tzot

उत्तर

37

आप मूल रूप से यह पहले से ही है:

>>> mylist = [["quux", 1, "a"], ["bar", 0, "b"]] 
>>> mylist.sort(key=lambda x: x[1]) 
>>> print mylist 

देता है:

[['bar', 0, 'b'], ['quux', 1, 'a']] 

यह मेरी सूची को जगह में सॉर्ट करेगा।

[यह पैरा संपादित @ डैनियल के सुधार के लिए धन्यवाद।] sortedhttp://wiki.python.org/moin/HowTo/Sorting/ में वर्णित इनपुट को वास्तव में बदलने के बजाए क्रमबद्ध एक नई सूची लौटाएगा।

+0

भेद जानने के लिए अच्छा, धन्यवाद। – user248237dfsf

4

जवाब देने के लिए "हल कर" का उपयोग करें, है यानी

sorted(mylist, key=lambda x: x[1]) 
+0

मेरे पास पैरामीटर पीछे थे। असंगत लगता है कि उदा। नक्शा/फ़िल्टर/लैम्ब्डा को पहले पैरामीटर को कम करें और दूसरे पैरामीटर को सूचीबद्ध करें लेकिन रिवर्स को सॉर्ट करें। – javadba

7

आपके पास दो विकल्प, बहुत तुम क्या वर्णित के करीब है, वास्तव में है:

mylist.sort(key=lambda x: x[1]) # In place sort 
new_list = sorted(mylist, key=lambda x: x[1]) 
9

यह इस तरह के एक आम जरूरत है कि के लिए यह operator.itemgetter के रूप में मानक पुस्तकालय में जोड़ा गया है, का समर्थन है:

from operator import itemgetter 
mylist = [["quux", 1, "a"], ["bar", 0, "b"]] 
mylist.sort(key=itemgetter(1)) # or sorted(mylist, key=...) 
4

क्रमबद्ध और itemgetter सबसे तेज है।

>>> import operator 
>>> import timeit 

>>> mylist = [["quux", 1, "a"], ["bar", 0, "b"]] 
>>> t1 = timeit.Timer(lambda: mylist.sort(key=lambda x: x[1])) 
>>> t1.timeit() 
1.6330803055632404 

>>> t2 = timeit.Timer(lambda: mylist.sort(key=operator.itemgetter(1))) 
>>> t2.timeit() 
1.3985503043467773 

>>> t3 = timeit.Timer(lambda: sorted(mylist, key=operator.itemgetter(1))) 
>>> t3.timeit() 
2.6329514733833292 

>>> t4 = timeit.Timer(lambda: sorted(mylist, key=lambda x: x[1])) 
>>> t4.timeit() 
2.9197154810598533 
संबंधित मुद्दे