आंतरिक सूची के एक विशिष्ट सूचकांक द्वारा सूचियों की सूची कैसे छाँटी जाए?


233

मेरे पास सूचियों की एक सूची है। उदाहरण के लिए,

[
[0,1,'f'],
[4,2,'t'],
[9,4,'afsd']
]

अगर मैं आंतरिक सूचियों के स्ट्रिंग क्षेत्र द्वारा बाहरी सूची को सॉर्ट करना चाहता था, तो आप अजगर में ऐसा कैसे करेंगे?


6
ट्यूटोरियल का लिंक: wiki.python.org/moin/HowTo/Sorting
फेलिक्स क्लिंग

3
उपयोगी लिंक: stackoverflow.com/questions/18142090/…
dot.Py

जवाबों:


320

यह आइटम करने वाले के लिए एक काम है

>>> from operator import itemgetter
>>> L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> sorted(L, key=itemgetter(2))
[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

यहां लैम्बडा फ़ंक्शन का उपयोग करना भी संभव है, हालांकि लैम्बडा फ़ंक्शन इस सरल मामले में धीमा है


क्या होगा अगर मैं मामले को अनदेखा करना चाहूंगा?
bzupnick

5
@bzupnick, का उपयोग करें key=lambda x:x[2].casefold()। यदि आपका पायथन नया नहीं है, तो .lower()इसके बजाय का उपयोग करें.casefold()
जॉन ला रोय जूल

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] जैसी सूची के साथ यह हो सकता है। हम x [0] [1] में तत्वों के संबंध में आइटमगेटर () का उपयोग कर सॉर्ट करते हैं?
निदिघी

क्या मैं क्रम के सूचक भी प्राप्त कर सकता हूं, इसलिए उसी क्रम में अन्य संबंधित सूची को क्रमबद्ध करने के लिए?
क्वार्क

@quaryk यह एक दिलचस्प सवाल लगता है, लेकिन टिप्पणियों में जवाब देने के लिए उपयुक्त नहीं है। यदि आपको ऐसा प्रश्न नहीं मिलता है जो इसे कवर करता है, तो आपको एक बनाना चाहिए।
जॉन ला रोय

175

जगह में

>>> l = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> l.sort(key=lambda x: x[2])

छँटाई का उपयोग कर जगह में नहीं:

>>> sorted(l, key=lambda x: x[2])

4
क्या आप इसके बारे में in placeऔर जानकारी दे सकते हैं not in place?
क्यूं

9
@qun, "in place" का अर्थ है कि पुरानी सूची की मेमोरी को सॉर्ट किए गए के लिए पुन: उपयोग किया जाता है। "जगह में नहीं" का मतलब है कि पुरानी सूची अपरिवर्तित बनी हुई है और एक नई सूची बनाई गई है।
जॉन ला रोयॉ

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] इस तरह की सूची के साथ है। हम x [0] [1] में तत्वों के संबंध में कैसे छांट सकते हैं?
निदिघी

81

आइटमगेटर आपको कई मानदंडों / स्तंभों के आधार पर छाँटने देता है:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))

5
मुझे लगता है कि यह उत्तर बहुत महत्वपूर्ण है। मुझे लगता है कि इनर एरे इंडेक्स के आधार पर छाँटने की कोशिश करने वाले लोग यहाँ गिर जाएँगे, लेकिन MULTIPLE इनर एरे इंडेक्स द्वारा सॉर्ट करने वाले लोग यहाँ से शुरू होंगे और आपके जवाब से मुझे यह देखने में मदद मिली कि आइटमटेगर वास्तव में आपके लिए ही होगा!
ZekeDroid

11

मेमने के कार्य के माध्यम से कई मापदंड भी लागू किए जा सकते हैं

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0]))

10
array.sort(key = lambda x:x[1])

आप इस स्निपेट का उपयोग करके आसानी से सॉर्ट कर सकते हैं, जहां 1 तत्व का सूचकांक है।



8

मुझे लगता है कि लैम्ब्डा फ़ंक्शन आपकी समस्या को हल कर सकता है।

old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]

#let's assume we want to sort lists by last value ( old_list[2] )
new_list = sorted(old_list, key=lambda x: x[2])

#Resulst of new_list will be:

[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

2
**old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]
    #let's assume we want to sort lists by last value ( old_list[2] )
    new_list = sorted(old_list, key=lambda x: x[2])**

सही है अगर मैं गलत हूँ, लेकिन 'x [2]' को सूची में 3 आइटम नहीं बुला रहा हूँ, तो नेस्टेड सूची में 3 आइटम नहीं है? क्या यह x [2] [2] होना चाहिए?


नहीं, क्योंकि कुंजी / लैम्ब्डा पहले से ही पहले-स्तर की सूची में मौजूद वस्तुओं पर निर्भर है। x बदले में प्रत्येक आइटम के लिए एक स्थानीय चर है।
ड्रैगनलॉर्ड

1

समझने में अधिक आसान है (लैम्बडा वास्तव में क्या कर रही है):

ls2=[[0,1,'f'],[4,2,'t'],[9,4,'afsd']]
def thirdItem(ls):
    #return the third item of the list
    return ls[2]
#Sort according to what the thirdItem function return 
ls2.sort(key=thirdItem)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.