python - सूचियों / tuples के क्रमबद्ध (सूची / tuple) कैसे क्रमबद्ध करें?





list sorting (9)


sorted_by_second = sorted(data, key=lambda tup: tup[1])

या:

data.sort(key=lambda tup: tup[1])  # sorts in place

मेरे पास कुछ डेटा है या तो सूची में सूचियां हैं, या सूची में टुपल्स हैं।

data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]

और मैं सबसेट में दूसरे तत्व द्वारा सॉर्ट करना चाहता हूं। मतलब, 2,5,8 से सॉर्टिंग जहां 2 (1,2,3) से है, 5 (4,5,6) से है। ऐसा करने का आम तरीका क्या है? क्या मुझे अपनी सूची में टुपल्स या सूचियों को स्टोर करना चाहिए? चूंकि टुपल्स अधिक लचीले होते हैं।




स्टीफन का जवाब वह है जिसका मैं उपयोग करूंगा। पूर्णता के लिए, यहां सूची समझ के साथ डीएसयू (सजाने-क्रमबद्ध-निर्विवाद) पैटर्न है:

decorated = [(tup[1], tup) for tup in data]
decorated.sort()
undecorated = [tup for second, tup in decorated]

या, अधिक तेज़:

[b for a,b in sorted((tup[1], tup) for tup in data)]

जैसा कि पाइथन सॉर्टिंग हाउटो में उल्लेख किया गया है, यह महत्वपूर्ण कार्य उपलब्ध होने पर पाइथन 2.4 के बाद से अनावश्यक रहा है।




एक टुपल छंटनी काफी सरल है:

tuple(sorted(t))



from operator import itemgetter
data.sort(key=itemgetter(1))



लैम्ब्डा के बिना:

def sec_elem(s):
    return s[1] 
sorted(data, key=sec_elem) 



@ स्टीफन का जवाब बिंदु पर है! बेहतर दृश्यता के लिए यहां एक उदाहरण दिया गया है,

रेडी प्लेयर वन प्रशंसकों के लिए चिल्लाओ! =)

>>> gunters = [('2044-04-05', 'parzival'), ('2044-04-07', 'aech'), ('2044-04-06', 'art3mis')]
>>> gunters.sort(key=lambda tup: tup[0])
>>> print gunters
[('2044-04-05', 'parzival'), ('2044-04-06', 'art3mis'), ('2044-04-07', 'aech')]

key एक ऐसा फ़ंक्शन है जिसे संग्रह के आइटम्स को तुलना के लिए बदलने के लिए कहा जाएगा .. जैसे जावा में विधि की तुलना करें।

कुंजी पर पारित पैरामीटर कुछ ऐसा होना चाहिए जो कॉल करने योग्य है। यहां, lambda का उपयोग एक अज्ञात फ़ंक्शन बनाता है (जो एक कॉल करने योग्य है)।
लैम्ब्डा का सिंटैक्स शब्द लैम्ब्डा है जिसके बाद एक पुनरावर्तक नाम होता है, फिर कोड का एक ब्लॉक होता है।

उदाहरण के नीचे, हम टुपल की एक सूची को क्रमबद्ध कर रहे हैं जिसमें कुछ घटना और अभिनेता के नाम की जानकारी है।

हम घटना सूची के समय तक इस सूची को क्रमबद्ध कर रहे हैं - जो एक ट्यूपल का 0 वां तत्व है।

नोट - s.sort([cmp[, key[, reverse]]]) जगहों की जगहों को s.sort([cmp[, key[, reverse]]]) है




मैं सिर्फ स्टीफन के जवाब में जोड़ना चाहता हूं यदि आप सरणी को उच्च से कम क्रमबद्ध करना चाहते हैं, तो ऊपर दी गई टिप्पणियों के अलावा अन्य तरीका यह है कि इसे लाइन में जोड़ने के लिए:

reverse = True

और परिणाम निम्नानुसार होंगे:

data.sort(key=lambda tup: tup[1], reverse=True)



एकाधिक मानदंडों द्वारा क्रमबद्ध करने के लिए, अर्थात् उदाहरण के लिए टुपल में दूसरे और तीसरे तत्वों द्वारा, चलो

data = [(1,2,3),(1,2,1),(1,1,4)]

और इसलिए एक लैम्ब्डा को परिभाषित करें जो उदाहरण के लिए प्राथमिकता का वर्णन करने वाले टुपल को लौटाता है

sorted(data, key=lambda tup: (tup[1],tup[2]) )
[(1, 1, 4), (1, 2, 1), (1, 2, 3)]



इसे इस्तेमाल करे:

collections.namedtuple()

असल में, namedtuples , हल्के ऑब्जेक्ट प्रकार बनाने के लिए namedtuples आसान हैं। वे सरल कार्यों के लिए सुविधाजनक कंटेनरों में tuples बारी। namedtuples साथ, आपको namedtuples सदस्यों तक पहुंचने के लिए पूर्णांक सूचकांक का उपयोग करने की आवश्यकता नहीं है।

उदाहरण:

कोड 1:

>>> from collections import namedtuple

>>> Point = namedtuple('Point','x,y')

>>> pt1 = Point(1,2)

>>> pt2 = Point(3,4)

>>> dot_product = ( pt1.x * pt2.x ) +( pt1.y * pt2.y )

>>> print dot_product
11

कोड 2:

>>> from collections import namedtuple

>>> Car = namedtuple('Car','Price Mileage Colour Class')

>>> xyz = Car(Price = 100000, Mileage = 30, Colour = 'Cyan', Class = 'Y')

>>> print xyz

Car(Price=100000, Mileage=30, Colour='Cyan', Class='Y')
>>> print xyz.Class
Y




python list sorting tuples