2012-03-19 7 views
8

मैं int एस की पाइथन सूची को सॉर्ट करने का प्रयास कर रहा हूं और फिर उच्चतम लौटने के लिए .pop() फ़ंक्शन का उपयोग कर रहा हूं।'.sort()' क्यों पाइथन में सूची 'कोई नहीं' का कारण बनता है?

def LongestPath(T):  
    paths = [Ancestors(T,x) for x in OrdLeaves(T)] 
    #^ Creating a lists of lists of ints, this part works 
    result =[len(y) for y in paths ] 
    #^ Creating a list of ints where each int is a length of the a list in paths 
    result = result.sort() 
    #^meant to sort the result 
    return result.pop() 
    #^meant to return the largest int in the list (the last one) 

मैं भी कोशिश की है

def LongestPath(T): 
    return[len(y) for y in [Ancestors(T,x) for x in OrdLeaves(T)] ].sort().pop() 

दोनों ही मामलों .sort() सूची का कारण बनता है में None (कोई .pop() समारोह में त्रुटि है और देता है जो) होने के लिए: मैं एक अलग तरीके से विधि लेखन की कोशिश की है । जब मैं .sort() हटा देता हूं तो यह ठीक काम करता है लेकिन सूची क्रमबद्ध नहीं होने के बाद से सबसे बड़ा int वापस नहीं करता है।

+1

कोई कारण नहीं है कि आप ['अधिकतम()'] (http://docs.python.org/py3k/library/functions.html#max) का उपयोग नहीं कर रहे हैं? –

+0

एचसी_, जब मुझे लगता है कि मुझे 'एट्रिब्यूट एरर:' सूची 'ऑब्जेक्ट में कोई विशेषता नहीं है' max'' – Btuman

+3

ऐसा इसलिए है क्योंकि 'अधिकतम() 'एक कार्य है, न कि' सूची 'विधि। – kindall

उत्तर

17

सीधे शब्दों में जाने से

result = result.sort() 

काम को दूर सिर्फ

result.sort() 

sort विधि काम करता है यथा-स्थान (यह मौजूदा सूची को संशोधित करता है), इसलिए कोई काम के लिए आवश्यक है, और यह None रिटर्न । जब आप सूची के नाम पर अपना परिणाम असाइन करते हैं, तो आप None असाइन कर रहे हैं। जबकि छँटाई है,

max(len(Ancestors(T,x)) for x in OrdLeaves(T)) 

max रैखिक समय में चल रही है, हे (एन) ओ (nlogn):

यह आसानी से कर सकते हैं (और अधिक कुशलता से) एक एक लाइनर के रूप में लिखा जा। आपको नेस्टेड सूची समझ की भी आवश्यकता नहीं है, एक जनरेटर अभिव्यक्ति करेगा।

+0

ठीक है, तो दूसरी विधि क्यों काम नहीं करेगी? .sort() के साथ सूची लौटने के कारण यह 'कोई नहीं' – Btuman

+1

@Btuman वापस लौटने का कारण बनता है क्योंकि आप अभी भी '.port()' - के प्रयास करते समय '.sort()' के वापसी मान तक पहुंच रहे हैं। आप 'none.pop() 'करने की कोशिश कर रहे हैं, दोनों संस्करणों में' sortedlist.pop()' नहीं। यदि आप _really_ 'अधिकतम' के बजाय एक-लाइनर और सॉर्ट का उपयोग करना चाहते हैं, तो आपको ऑर्डलेव्स (टी) में x के लिए क्रमबद्ध (लेन (पूर्वजों (टी, एक्स)) का उपयोग करना चाहिए [- 1] '। '.pop()' दो चीजें करता है - यह अंतिम मूल्य को हटा देता है और देता है। चूंकि आपको केवल इसे वापस करने की आवश्यकता है, इसे हटाएं, बस '[-1] 'का उपयोग करें। – agf

+2

@ बुटुमान स्पष्ट होने के लिए, '.sort() 'सूची को' कोई नहीं 'होने का कारण नहीं है, यह केवल' कोई नहीं 'लौटाता है। हालांकि, जब आप 'परिणाम' नाम पर 'कोई नहीं' असाइन करते हैं, तो आप क्रमबद्ध सूची तक पहुंच खो देते हैं - 'परिणाम' अब इससे इंगित नहीं करता है। एक ही चीज में एक ही चीज हो रही है - जब आप '.sort()' करते हैं, तो आप सूची तक पहुंच खो रहे हैं, क्योंकि आपके पास केवल आंतरिक अभिव्यक्ति के परिणाम तक पहुंच है, और '.sort () '' कोई नहीं 'सूची है जो यह संशोधित करती है। – agf

4

.sort() कोई भी रिटर्न नहीं देता है और सूची में जगह टाइप करता है।

0

पायथन sort() में एक इनस्थल ऑपरेशन है। तो result.sort()None देता है, लेकिन क्रमबद्ध करने के लिए result बदलता है। इसलिए अपनी समस्या से बचने के लिए, result को ओवरराइट न करें जब आप sort() पर कॉल करते हैं।

1

list.sort() एक सूची वापस नहीं करता है - यह विध्वंस सूची आप छँटाई कर रहे हैं को संशोधित करता है:

In [177]: range(10) 
Out[177]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

In [178]: range(10).sort() 

In [179]: 

कहा max एक सूची में सबसे बड़ा तत्व पाता है, और अपने विधि की तुलना में अधिक कुशल हो जाएगा।

0

क्या sorted फ़ंक्शन का उपयोग न करने का कोई कारण नहीं है? sort() केवल सूचियों पर परिभाषित किया गया है, लेकिन sorted() किसी भी पुनरावृत्ति के साथ काम करता है, और जिस तरह से आप उम्मीद कर रहे हैं कार्य करता है। विवरण छंटाई के लिए this article देखें।

इसके अलावा, क्योंकि आंतरिक रूप से यह timsort का उपयोग करता है, यदि आपको कुंजी 1 को सॉर्ट करने की आवश्यकता है तो यह बहुत ही कुशल है, फिर कुंजी 2 पर सॉर्ट करें।

9

यह

result = result.sort() 

इस

result.sort() 

यह अजगर में एक सम्मेलन है होना चाहिए कि तरीकों कि दृश्यों उत्परिवर्तित लौट None

पर विचार करें:

>>> a_list = [3, 2, 1] 
>>> print a_list.sort() 
None 
>>> a_list 
[1, 2, 3] 

>>> a_dict = {} 
>>> print a_dict.__setitem__('a', 1) 
None 
>>> a_dict 
{'a': 1} 

>>> a_set = set() 
>>> print a_set.add(1) 
None 
>>> a_set 
set([1]) 

पायथन के डिजाइन और इतिहास पूछे जाने वाले प्रश्न gives the reasoning इस डिजाइन फैसले के पीछे (सूचियों के संबंध में):

Why doesn’t list.sort() return the sorted list?

In situations where performance matters, making a copy of the list just to sort it would be wasteful. Therefore, list.sort() sorts the list in place. In order to remind you of that fact, it does not return the sorted list. This way, you won’t be fooled into accidentally overwriting a list when you need a sorted copy but also need to keep the unsorted version around.

In Python 2.4 a new built-in function – sorted() – has been added. This function creates a new list from a provided iterable, sorts it and returns it.

0

आप आप क्या चाहते हैं के लिए के लिए एक कस्टम समारोह की जरूरत नहीं है प्राप्त करें, आपको सबसे पहले उन विधियों को समझने की आवश्यकता है जिनका आप उपयोग कर रहे हैं!

sort() अजगर में एक सूची ing यह करता जगह में, कि है, sort() से वापसी None है। सूची स्वयं संशोधित है, एक नई सूची वापस नहीं आई है।

>>>results = ['list','of','items'] 
>>>results 

['list','of','items'] 

>>>results.sort() 
>>>type(results) 

<type 'list'> 

>>>results 

['items','list','of'] 

>>>results = results.sort() 
>>>results 
>>> 
>>>type(results) 

<type 'NoneType'> 

आप देख सकते हैं, जब आप sort() आवंटित करने के लिए प्रयास करते हैं, तो आप अब सूची प्रकार है।

2

यह पहले ही सही ढंग से उत्तर दिया गया है: list.sort()None देता है। कारण है कि "कमांड-क्वेरी पृथक्करण" है:

http://en.wikipedia.org/wiki/Command-query_separation

अजगर रिटर्न None हर कार्य कुछ लौटना चाहिए क्योंकि, और परंपरा है कि एक समारोह है कि किसी भी उपयोगी मूल्य का उत्पादन नहीं करता None लौट जाना है।

मैंने कभी भी संदर्भ के बाद एक टिप्पणी डालने के अपने सम्मेलन को कभी नहीं देखा है, लेकिन रेखा पर इंगित करने के लिए एक कैरेट के साथ टिप्पणी शुरू कर दी है। कृपया संदर्भित लाइनों से पहले टिप्पणियां दें।

जबकि आप .pop() विधि का उपयोग कर सकते हैं, तो आप सूची को सूचीबद्ध भी कर सकते हैं। सूची में अंतिम मान हमेशा -1 के साथ अनुक्रमित किया जा सकता है, क्योंकि पायथन नकारात्मक सूचकांक में "चारों ओर लपेटें" और अंत में सूचकांक पिछड़ा हुआ है।

लेकिन हम और भी सरल बना सकते हैं। सूची को सॉर्ट करने का एकमात्र कारण यह है कि आप इसका अधिकतम मूल्य पा सकते हैं। इसके लिए पाइथन में एक अंतर्निहित फ़ंक्शन है: max()

list.sort() का उपयोग करके पूरी सूची बनाना आवश्यक है। फिर आप सूची से एक मूल्य खींचेंगे और इसे छोड़ देंगे। max() सूची को स्टोर करने के लिए संभावित रूप से बड़ी मात्रा में स्मृति आवंटित करने की आवश्यकता के बिना एक पुनरावर्तक का उपभोग करेगा।

इसके अलावा, पायथन में, समुदाय पीईपी 8 नामक कोडिंग मानक का उपयोग पसंद करता है। पीईपी 8 में, आपको फ़ंक्शन नामों के लिए लोअर-केस का उपयोग करना चाहिए, और कैमेलकेस की बजाय शब्दों को अलग करने के लिए अंडरस्कोर का उपयोग करना चाहिए।

http://www.python.org/dev/peps/pep-0008/

ध्यान में टिप्पणी के साथ, यहाँ समारोह की मेरी पुनर्लेखन है:

def longest_path(T): 
    paths = [Ancestors(T,x) for x in OrdLeaves(T)] 
    return max(len(path) for path in paths) 
कॉल अंदर max() करने के लिए

हम एक "जनरेटर अभिव्यक्ति" कि प्रत्येक मान के लिए लंबाई की गणना करता है सूची में pathsmax() इस मूल्य से मूल्य खींचेंगे, सबसे बड़ा रखते हुए, जब तक कि सभी मान समाप्त न हों।

लेकिन अब यह स्पष्ट है कि हमें वास्तव में paths सूची की भी आवश्यकता नहीं है। यहाँ अंतिम संस्करण है:

def longest_path(T): 
    return max(len(Ancestors(T, x)) for x in OrdLeaves(T)) 

मैं वास्तव में लगता है कि स्पष्ट paths चर के साथ संस्करण में थोड़ा और अधिक पठनीय है, लेकिन इस भयानक नहीं है, और अगर वहाँ रास्तों में से एक बड़ी संख्या में हो सकता है, यदि आप एक नज़र आ सकते हैं paths सूची को बनाने और नष्ट करने के कारण प्रदर्शन सुधार।

संबंधित मुद्दे