কেন "রিটার্ন লিস্ট.সোর্ট ()" কোনওটিই ফেরায় না, তালিকাটি নয়?


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) হয়ে গেছে। সহজ।
রানলেভেল0

1
@ রানলেভেল0 যা বলেছিল তা যোগ করা (যা একটি ভাল ধারণা): আপনি একটি theSet' into a sorted list with সাজানো (দ্যসেট) রূপান্তর করতে পারেন ``
জাজ 19

খুব অনিয়মিত ভাষা
নিকোলাস

এটি মূল - তবে সমস্যাযুক্ত / বিরক্তিকর - ভাষার দার্শনিক পছন্দ। সাধারণভাবে শৃঙ্খলা অজগর একটি অনাথ ধারণা।
জাভাদবা

উত্তর:


194

list.sortতালিকায় স্থানটি সাজান, অর্থাত্ এটি কোনও নতুন তালিকা ফেরত দেয় না। শুধু লেখো

newList.sort()
return newList

18
return sorted(newList)খাটো হয়। ভেরিয়েবল স্থানীয় হওয়ায় এখানে কিছু যায় আসে না, তবে স্থানটিতে সাজানো কিছু ক্ষেত্রে ভাগ করা ভেরিয়েবল পরিবর্তন করতে পারে।
জিন-

এটি আকর্ষণীয় যে কোনও তালিকায় যদি একটি এন্ট্রি যুক্ত হয় তবে হয় a.append('x')বা a.extend('x)আপনি sort()শেষ পর্যন্ত চেইন করতে পারবেন না । এটি 2 লাইনে বিভক্ত করতে হবে। পদ্ধতিগুলি তালিকাটি ফিরিয়ে দিলে এটি আরও ভাল হত! docs.python.org/3/tutorial/datastructures.html এই একই বার্তাটি কেবল আমাকে তা করে বিট করে। ফলস্বরূপ আপনাকে জিনিসটি দুটি লাইনে বিভক্ত করতে .sort() হবে , আপনাকে sorted()পরে তালিকায় না ব্যবহার করতে হবে , যেহেতু এটি একই ত্রুটি তৈরি করে l = ['1']; l = sorted(l.append('2'))(আমি সবেমাত্র আধা-কোলন যুক্ত করেছি যাতে আপনি কাটা / পেস্ট এবং চালাতে পারেন)
JGFMK

আমি এটিকে এটিকে দেখার মতো হতেও চাই : গ্রান্টজেনসস ডকস / ডটস / সাপোর্টকন্টিনিয়ারস , গিথব. com / grantjenks / python - sortcontainers আমার, ইতিমধ্যে একটি তালিকা থেকে একটি সেট থেকে রিফ্যাক্টরিংয়ের কথা ভাবছিলাম, যেহেতু আমি না সদৃশ চান, এবং তারপর একটি SortedSet বাস্তবায়ন খুঁজছেন ছিল এবং সংগ্রহগুলি এক খুঁজে পাইনি মডিউল ... সূত্রঃ stackoverflow.com/questions/5953205/...
JGFMK

3
sortফাংশনটি এভাবে ডিজাইন করা হয়েছিল কেন ? কোনওটির পরিবর্তে বাছাই করা তালিকাটি যদি ফেরত দেয় তবে কোনও কর্মক্ষমতা ওভারহেড বা অন্যান্য ত্রুটি রয়েছে?
লেই ইয়াং

1
আমিও folowing সমস্যা সম্মুখীন: print(newList.sort())দিলেন None। যাইহোক আমি যখন, newList.sort()এবং তারপর print(newList)এটি কাজ করে।
কটস

135

সমস্যাটি এখানে:

answer = newList.sort()

sortবাছাই করা তালিকাটি ফেরত দেয় না; পরিবর্তে, এটি জায়গায় তালিকাটি বাছাই করে।

ব্যবহার করুন:

answer = sorted(newList)

5
এটি সবচেয়ে বেশি প্রয়োজন: list.sort()এবং এর মধ্যে পার্থক্য sorted(list)
geekoverdose

62

পাইথনের ডেভ লিস্টে গুইডো ভ্যান রসমের একটি ইমেল এখানে ব্যাখ্যা করেছে যে তিনি কেন সেই পদক্ষেপগুলিকে selfপ্রভাবিত করে এবং কোনও নতুন ফিরিয়ে দেয় না এমন অপারেশনগুলিতে ফিরে না আসার জন্য কেন নির্বাচন করেন choose

এটি একটি কোডিং শৈলী থেকে এসেছে (অন্যান্য বিভিন্ন ভাষায় জনপ্রিয়, আমি বিশ্বাস করি এটিতে বিশেষত লিস্প আনন্দিত হয়) যেখানে কোনও একক বস্তুর উপর একাধিক পার্শ্ব প্রতিক্রিয়া এই জাতীয় শৃঙ্খলিত হতে পারে:

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

যা হিসাবে একই হবে

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

আমি শৃঙ্খলা ফর্মটি পাঠযোগ্যতার জন্য হুমকী মনে করি; এটি প্রয়োজন যে পাঠক অবশ্যই প্রতিটি পদ্ধতির সাথে নিবিড়ভাবে পরিচিত হতে হবে। দ্বিতীয় ফর্মটি পরিষ্কার করে দেয় যে এই কলগুলির প্রতিটি একই বস্তুতে কাজ করে এবং তাই আপনি শ্রেণি এবং এর পদ্ধতিগুলি খুব ভাল জানেন না, আপনি বুঝতে পারবেন যে দ্বিতীয় এবং তৃতীয় কলটি x এ প্রয়োগ করা হয়েছে (এবং এটি সমস্ত কলগুলি তাদের পার্শ্ব-প্রতিক্রিয়ার জন্য করা হয়েছে), এবং অন্য কোনও উদ্দেশ্যে নয় to

আমি স্ট্রিং প্রসেসিং অপারেশনগুলির মতো নতুন মানগুলিকে ফিরিয়ে দেওয়া অপারেশনের জন্য চেইন রিজার্ভ করতে চাই:

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

33
মজাদারভাবে, split(":").lower()একটি খারাপ শৃঙ্খল কারণ splitকোনও lowerপদ্ধতি নেই এমন একটি তালিকা প্রদান করে ।
সুপারবিসাইডম্যান

14

পাইথন অভ্যাসগত ভাবেই আয় Noneফাংশন ও পদ্ধতি যে ডেটা পরিবর্তন ঘটান, যেমন থেকে list.sort, list.appendএবংrandom.shuffle ধারণা করা হচ্ছে যে এটা যে এটি mutating হয়েছিল ইঙ্গিতগুলি দিয়ে।

আপনি যদি কোনও পুনরাবৃত্তযোগ্য নিতে চান এবং এর আইটেমগুলির একটি নতুন, সাজানো তালিকাটি ফিরিয়ে দিতে চান তবে sortedবিল্টিন ফাংশনটি ব্যবহার করুন ।


14

পাইথনের দুই ধরণের প্রকার রয়েছে: একটি সাজানোর পদ্ধতি (বা "সদস্য ফাংশন") এবং একটি সাজানোর ফাংশন । বাছাই করা পদ্ধতিটি নামযুক্ত বস্তুর সামগ্রীতে পরিচালিত হয় - এটিকে এমন ক্রিয়া হিসাবে ভাবুন যা বস্তুটি নিজেকে পুনরায় অর্ডার করতে চলেছে । সাজানো ফাংশন হ'ল একটি অবজেক্ট দ্বারা প্রতিনিধিত্ব করা ডেটার উপর একটি ক্রিয়াকলাপ এবং সাজানো ক্রমে একই বিষয়বস্তু সহ একটি নতুন অবজেক্ট ফেরত দেয়।

পূর্ণসংখ্যার একটি তালিকা দেওয়া নামের lতালিকাটি স্বয়ংক্রিয়ভাবে পুনরায় সাজানো হবে যদি আমরা কল করি l.sort():

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

এই পদ্ধতির কোনও ফেরতের মূল্য নেই has কিন্তু যদি আমরা ফলাফল নির্ধারণ করার চেষ্টা করি 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]

জেনে রাখুন যে ফিরে মান হতে না একটি গভীর কপি , তাই যথারীতি তালিকা মধ্যে অন্তর্ভুক্ত উপাদানের উপরে পার্শ্ব-effecty অপারেশন সম্পর্কে সতর্ক হতে:

>>> 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=...)

দ্রষ্টব্য: সাজানোর () এবং সাজানো () এর মধ্যে সাদামাটা পার্থক্য হ'ল: সাজানো () কোনও মান ফেরত দেয় না, বাছাই করা () একটি পুনরাবৃত্তিযোগ্য তালিকা দেয় returns

আপনার ক্ষেত্রে তাই 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.