क्यों "वापसी सूची। एसओआरटी ()" कोई नहीं, सूची नहीं?


154

मैं यह सत्यापित करने में सक्षम हूं कि findUniqueWordsपरिणाम एक क्रमबद्ध है list। हालांकि, यह सूची वापस नहीं करता है। क्यों?

def findUniqueWords(theList):
    newList = []
    words = []

    # Read a line at a time
    for item in theList:

        # Remove any punctuation from the line
        cleaned = cleanUp(item)

        # Split the line into separate words
        words = cleaned.split()

        # Evaluate each word
        for word in words:

            # Count each unique word
            if word not in newList:
                newList.append(word)

    answer = newList.sort()
    return answer

मुझे नहीं लगता कि आपको आइटम को इतनी बार स्ट्रिंग में बदलने की आवश्यकता है। एक बार सामान्य रूप से पर्याप्त है और इसे क्लीनअप के इनपुट पर भी करना है।
बेन

3
बस एक मूर्खतापूर्ण विचार है, लेकिन अगर आप अद्वितीय वस्तुओं की एक सूची चाहते हैं, तो आप बस एक सेट में क्यों नहीं बदलते? यदि आवश्यक हो तो आप उन्हें फिर से एक सूची में बदल सकते हैं। theSet= set(theList) और आप कर रहे हैं, आपको इसे केवल सूची में वापस लाने की आवश्यकता है: हो theList = list(theSet) गया। आसान।
रनलेवेला

1
@ Runlevel0 ने जो कहा, (जो एक अच्छा विचार है) को जोड़ना: आप एक theSet' into a sorted list with सॉर्ट (सेट) को परिवर्तित कर सकते हैं ।
ज़ाज़

बहुत अनियमित भाषा
निकोलस

यह भाषा का एक कोर - लेकिन समस्याग्रस्त / परेशान करने वाला - दार्शनिक विकल्प है। सामान्य रूप से चाइनिंग अजगर में एक अनाथ अवधारणा है।
जवदाबा

जवाबों:


194

list.sortसूची को जगह में बदलें, यानी यह एक नई सूची नहीं लौटाती है। बस लिखें

newList.sort()
return newList

18
return sorted(newList)छोटा है। चर स्थानीय होने के बाद से यहां कोई फर्क नहीं पड़ता, लेकिन इन-प्लेस सॉर्ट कुछ मामलों में साझा चर को बदल सकता है।
जीन फ़्राँस्वा Fabre

यह दिलचस्प है कि अगर एक प्रविष्टि को किसी सूची में जोड़ा जाता है, या तो a.append('x')या a.extend('x)आप sort()अंत में श्रृंखला नहीं बना सकते । इसे 2 लाइनों में विभाजित किया जाना है। यह अच्छा होगा कि सूची वापस करने के तरीके थे! docs.python.org/3/tutorial/datastructures.html यह वही संदेश मुझे बस कर रहा है। नतीजतन आपको चीज़ को दो लाइनों में तोड़ना होगा, आपको बाद में सूची में .sort() नहीं का उपयोग करना होगा sorted(), क्योंकि यह एक ही त्रुटि उत्पन्न करता है l = ['1']; l = sorted(l.append('2'))(मैंने सिर्फ अर्ध-
उपनिवेश

मैं यह भी जोड़ सकता हूं कि यह इस रूप में देखने योग्य हो सकता है: अनुदानjksks.com/docs/sortedcontainers , github.com/grantjenks/python-sortedcontainers मेरे में, पहले से ही एक सूची से एक सेट में वापस लेने की सोच रहा था, क्योंकि मैंने नहीं किया था। डुप्लिकेट चाहते हैं, और तब एक SortedSet कार्यान्वयन की तलाश में था, और संग्रह मॉड्यूल में एक नहीं मिला ... स्रोत: stackoverflow.com/questions/5953205/…
JGFMK

3
sortफ़ंक्शन को इस तरह से क्यों बनाया गया था ? क्या कोई प्रदर्शन ओवरहेड या अन्य कमियां हैं यदि कोई नहीं के बजाय क्रमबद्ध सूची लौटाता है?
लेई यांग

1
मुझे फोलोइंग समस्या का भी सामना करना पड़ा: print(newList.sort())दिया None। हालांकि जब मैंने किया था, newList.sort()और फिर print(newList)यह काम किया।
कोट्स

135

समस्या यहाँ है:

answer = newList.sort()

sortक्रमबद्ध सूची वापस नहीं करता है; बल्कि, यह जगह में सूची को सॉर्ट करता है।

उपयोग:

answer = sorted(newList)

5
यह वही है जिसकी सबसे अधिक आवश्यकता होगी: list.sort()और के बीच अंतर sorted(list)
geekoverdose

62

यहां पायथन की देव सूची में गुइडो वैन रोसुम का एक ईमेल है जिसमें बताया गया है कि वह selfउन कार्यों पर क्यों नहीं लौटता है जो ऑब्जेक्ट को प्रभावित करते हैं और एक नया नहीं लौटाते हैं।

यह एक कोडिंग शैली से आता है (विभिन्न अन्य भाषाओं में लोकप्रिय, मेरा मानना ​​है कि विशेष रूप से लिस्प इसमें शामिल हैं) जहां एक ही वस्तु पर दुष्प्रभावों की एक श्रृंखला इस तरह जंजीर हो सकती है:

 x.compress().chop(y).sort(z)

जो जैसा होगा वैसा ही होगा

  x.compress()
  x.chop(y)
  x.sort(z)

मुझे चैनिंग रूप पठनीयता के लिए खतरा लगता है; इसके लिए आवश्यक है कि पाठक प्रत्येक विधियों से गहनता से परिचित हो। दूसरा रूप यह स्पष्ट करता है कि इनमें से प्रत्येक कॉल एक ही वस्तु पर कार्य करता है, और इसलिए भले ही आप कक्षा और उसके तरीकों को बहुत अच्छी तरह से नहीं जानते हों, आप समझ सकते हैं कि दूसरी और तीसरी कॉल x और (पर लागू होती है) सभी कॉल उनके दुष्प्रभावों के लिए किए गए हैं), और कुछ और के लिए नहीं।

मैं नए मान लौटाने वाले संचालन के लिए चिंग को आरक्षित करना चाहूंगा, जैसे स्ट्रिंग प्रोसेसिंग ऑपरेशन:

 y = x.rstrip("\n").split(":").lower()

33
जाहिर है, split(":").lower()एक खराब श्रृंखला है क्योंकि splitएक सूची है कि एक lowerविधि नहीं है देता है ।
SuperBiasedMan

14

अजगर आदतन रिटर्न Noneकार्य करता है और तरीकों कि डेटा उत्परिवर्तित, इस तरह के रूप से list.sort, list.appendऔरrandom.shuffle विचार किया जा रहा है कि यह सच है कि यह परिवर्तनशील था संकेत के साथ,।

यदि आप एक पुनरावृत्ति लेना चाहते हैं और इसके आइटम की एक नई, क्रमबद्ध सूची वापस करना चाहते हैं, तो sortedबिल्टिन फ़ंक्शन का उपयोग करें ।


14

पायथन में दो प्रकार के प्रकार होते हैं: एक सॉर्ट विधि (या "सदस्य फ़ंक्शन") और एक प्रकार का फ़ंक्शन । सॉर्ट विधि नाम की ऑब्जेक्ट की सामग्री पर काम करती है - इसे एक ऐसी कार्रवाई के रूप में सोचें जो ऑब्जेक्ट को फिर से ऑर्डर करने के लिए ले जा रही है । सॉर्ट फ़ंक्शन एक ऑब्जेक्ट द्वारा दर्शाए गए डेटा पर एक ऑपरेशन है और एक सॉर्ट किए गए क्रम में एक ही सामग्री के साथ एक नई वस्तु देता है।

lयदि हम कॉल करते हैं, तो सूची नाम वाले पूर्णांकों की सूची को फिर से रिकॉर्ड किया जाएगा l.sort():

>>> l = [1, 5, 2341, 467, 213, 123]
>>> l.sort()
>>> l
[1, 5, 123, 213, 467, 2341]

इस पद्धति का कोई रिटर्न मान नहीं है। लेकिन क्या होगा अगर हम इसका परिणाम बताने की कोशिश करें l.sort()?

>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = l.sort()
>>> print(r)
None

rअब वास्तव में कुछ भी नहीं के बराबर है। यह उन अजीब, कुछ कष्टप्रद विवरणों में से एक है जो पायथन से अनुपस्थिति की अवधि के बाद एक प्रोग्रामर के बारे में भूल जाने की संभावना है (यही वजह है कि मैं यह लिख रहा हूं , इसलिए मैं फिर से नहीं भूलता)।

sorted()दूसरी ओर, फ़ंक्शन सामग्री के लिए कुछ भी नहीं करेगा l, लेकिन समान सामग्री के साथ एक नई, क्रमबद्ध सूची लौटाएगा l:

>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = sorted(l)
>>> l
[1, 5, 2341, 467, 213, 123]
>>> r
[1, 5, 123, 213, 467, 2341]

ज्ञात रहे कि लौटाया गया मूल्य एक गहरी प्रतिलिपि नहीं है , इसलिए सूची में शामिल तत्वों पर साइड-इफेक्टी संचालन के बारे में सतर्क रहें:

>>> spam = [8, 2, 4, 7]
>>> eggs = [3, 1, 4, 5]
>>> l = [spam, eggs]
>>> r = sorted(l)
>>> l
[[8, 2, 4, 7], [3, 1, 4, 5]]
>>> r
[[3, 1, 4, 5], [8, 2, 4, 7]]
>>> spam.sort()
>>> eggs.sort()
>>> l
[[2, 4, 7, 8], [1, 3, 4, 5]]
>>> r
[[1, 3, 4, 5], [2, 4, 7, 8]]

4

यह समझने के लिए कि यह सूची क्यों नहीं लौटाती है:

सॉर्ट () कोई मान वापस नहीं करता है जबकि सॉर्ट () विधि किसी दिए गए सूची के तत्वों को एक विशिष्ट क्रम में सॉर्ट करती है - आरोही या अवरोही किसी भी मूल्य लौटने के बिना।

तो समस्या यह है answer = newList.sort()कि जवाब कहां है, कोई नहीं।

इसके बजाय आप बस कर सकते हैं return newList.sort()

सॉर्ट का सिंटैक्स () विधि है:

list.sort(key=..., reverse=...)

वैकल्पिक रूप से, आप एक ही उद्देश्य के लिए पायथन के इन-बिल्ट फंक्शन सॉर्ट () का भी उपयोग कर सकते हैं।

sorted(list, key=..., reverse=...)

नोट: सॉर्ट () और सॉर्ट किए गए () के बीच का सबसे सरल अंतर है: सॉर्ट () कोई मान वापस नहीं करता है, जबकि सॉर्ट किया गया () एक पुनरावृत्त सूची देता है।

तो आपके मामले में answer = sorted(newList)


0

यदि आप चाहते हैं कि आप क्रमबद्ध सूची को वापस कर सकें यह अधिक सुविधाजनक है।

l1 = []
n = int(input())

for i in range(n):
  user = int(input())
  l1.append(user)
sorted(l1,reverse=True)

list.sort () विधि सूची को इन-प्लेस संशोधित करती है और कोई नहीं लौटाती है।

यदि आप अभी भी सॉर्ट करना चाहते हैं तो आप ऐसा कर सकते हैं।

l1 = []
n = int(input())

for i in range(n):
  user = int(input())
  l1.append(user)
l1.sort(reverse=True)
print(l1)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.