`সাজানো (তালিকা)` বনাম `list.sort ()` এর মধ্যে পার্থক্য কী?


194

list.sort()তালিকাটি বাছাই করে এবং মূল তালিকাটি প্রতিস্থাপন করে, যেখানে sorted(list)মূল তালিকাটি পরিবর্তন না করে তালিকার একটি সাজানো অনুলিপি প্রদান করে।

  • কখন একজনকে অপরটির চেয়ে বেশি পছন্দ করা হয়?
  • কোনটি আরও দক্ষ? কতটা করে?
  • কাজ list.sort()সম্পাদন করার পরে কি কোনও তালিকা অরসোর্টড অবস্থায় ফিরিয়ে দেওয়া যেতে পারে ?

4
আপনি (দুর্ঘটনাক্রমে) sorted()স্ট্রিং আর্গুমেন্টে কল করলেও মনে হয় এটি তালিকা বলে মনে হয়, আপনি একটি স্ট্রিং নয়, একটি তালিকার ফলাফল পেয়েছেন : sorted("abcd", reverse=True)দেয় ['d', 'c', 'b', 'a']না"dcba"
smci

উত্তর:


316

sorted()মূল তালিকাটি ক্ষতিগ্রস্থ না করে একটি নতুন বাছাই করা তালিকা দেয়। list.sort()তালিকায় স্থান অনুসারে বাছাই করে তালিকাগুলি সূচকে পরিবর্তিত করে এবং রিটার্ন দেয় None(সমস্ত স্থানের ক্রিয়াকলাপের মতো)।

sorted()কেবল তালিকাগুলি নয়, কোনও পুনরাবৃত্তির উপর কাজ করে। স্ট্রিংস, টিপলস, ডিকশনারি (কীগুলি পাবেন), জেনারেটর ইত্যাদিতে, তালিকা অনুসারে সমস্ত উপাদান রয়েছে, সাজানো হয়েছে।

  • list.sort()আপনি যখন তালিকাটি পরিবর্তন করতে চান তখন ব্যবহার করুন , sorted()যখন আপনি একটি নতুন সাজানো অবজেক্টটি ফিরে চান। sorted()যখন আপনি এমন কোনও কিছুকে সাজানোর জন্য ব্যবহার করুন যা পুনরাবৃত্তিযোগ্য, কোনও তালিকা এখনও নয়

  • তালিকার জন্য, এটির list.sort()চেয়ে বেশি দ্রুত sorted()কারণ এটির একটি অনুলিপি তৈরি করতে হয় না। অন্য যে কোনও পুনরাবৃত্তের জন্য আপনার কাছে বিকল্প নেই।

  • না, আপনি আসল অবস্থানগুলি পুনরুদ্ধার করতে পারবেন না। একবার আপনি বললে list.sort()আসল অর্ডারটি চলে যায়।


6
সাধারণভাবে, যখন একটি অজগর ফাংশন ফিরে আসে None, এটি একটি চিহ্ন, অপারেশনগুলি স্থানে করা হয় যে কারণে, যখন আপনি list.sort()এটি মুদ্রণ করতে চান তখন কিছুই দেয় না।
ব্যবহারকারী 1767754

45

sorted(list)বনাম মধ্যে পার্থক্য কি list.sort()?

  • list.sort তালিকায় স্থান পরিবর্তন করে এবং ফেরত দেয় None
  • sorted যে কোনও পুনরাবৃত্তীয় লাগে এবং সাজানো একটি নতুন তালিকা দেয়।

sorted এই পাইথন বাস্তবায়নের সমতুল্য, তবে সিপিথন বিল্টিন ফাংশনটি সি-তে লিখিতভাবে দ্রুত গতিতে চলতে হবে:

def sorted(iterable, key=None):
    new_list = list(iterable)    # make a new list
    new_list.sort(key=key)       # sort it
    return new_list              # return it

কখন ব্যবহার করবেন?

  • list.sortআপনি যখন মূল সাজানোর ক্রমটি ধরে রাখতে চান না তখন ব্যবহার করুন (সুতরাং আপনি মেমরির তালিকায় স্থানটি পুনরায় ব্যবহার করতে সক্ষম হবেন)) এবং আপনি যখন তালিকার একমাত্র মালিক হন (যদি তালিকাটি অন্য কোড দ্বারা ভাগ করা হয় এবং আপনি এটিকে পরিবর্তন করুন, আপনি সেই তালিকাটি ব্যবহার করার জন্য বাগগুলি প্রবর্তন করতে পারেন))
  • sortedআপনি যখন মূল সাজানোর ক্রমটি ধরে রাখতে চান বা যখন আপনি কেবলমাত্র আপনার স্থানীয় কোডের মালিকানাধীন একটি নতুন তালিকা তৈরি করতে চান তখন ব্যবহার করুন ।

List.sort () এর পরে কি কোনও তালিকার আসল অবস্থানগুলি পুনরুদ্ধার করা যায়?

না - যদি না আপনি নিজেই একটি অনুলিপি তৈরি করেন তবে সেই তথ্যটি হারিয়ে যায় কারণ সাজানটি জায়গায় জায়গায় করা হয়েছে।

"এবং কোনটি দ্রুত? আর কত দ্রুত?"

একটি নতুন তালিকা তৈরির শাস্তি চিত্রিত করতে, টাইমিট মডিউলটি ব্যবহার করুন, এখানে আমাদের সেটআপ রয়েছে:

import timeit
setup = """
import random
lists = [list(range(10000)) for _ in range(1000)]  # list of lists
for l in lists:
    random.shuffle(l) # shuffle each list
shuffled_iter = iter(lists) # wrap as iterator so next() yields one at a time
"""

এবং এলোমেলোভাবে সাজানো 10000 পূর্ণসংখ্যার তালিকার জন্য এখানে আমাদের ফলাফল রয়েছে, যেমনটি আমরা এখানে দেখতে পাচ্ছি, আমরা পুরানো তালিকা তৈরির ব্যয়কথাকে মিথ্যা প্রমাণ করেছি :

পাইথন 2.7

>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000)
[3.75168503401801, 3.7473005310166627, 3.753129180986434]
>>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000)
[3.702025591977872, 3.709248117986135, 3.71071034099441]

পাইথন ঘ

>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000)
[2.797430992126465, 2.796825885772705, 2.7744789123535156]
>>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000)
[2.675589084625244, 2.8019039630889893, 2.849375009536743]

কিছু প্রতিক্রিয়ার পরে, আমি সিদ্ধান্ত নিয়েছি যে আরও একটি পরীক্ষা বিভিন্ন বৈশিষ্ট্য সহ ઇચ્છનીય হবে। এখানে আমি প্রতিটি পুনরাবৃত্তির জন্য 1000 বার দৈর্ঘ্যের একই এলোমেলোভাবে অর্ডার করা তালিকা সরবরাহ করি।

import timeit
setup = """
import random
random.seed(0)
lst = list(range(100000))
random.shuffle(lst)
"""

আমি মার্টিজন দ্বারা উল্লিখিত অনুলিপি থেকে আসা এই বৃহত্তর ধরণের পার্থক্যের ব্যাখ্যা করছি, তবে এটি এখানে প্রাচীনতম জনপ্রিয় উত্তরে বর্ণিত বিন্দুটির উপর প্রাধান্য পাবে না, এখানে সময়ের বৃদ্ধি কেবল প্রায় 10%

>>> timeit.repeat("lst[:].sort()", setup=setup, number = 10000)
[572.919036605, 573.1384446719999, 568.5923951]
>>> timeit.repeat("sorted(lst[:])", setup=setup, number = 10000)
[647.0584738299999, 653.4040515829997, 657.9457361929999]

আমি উপরেরটিও আরও অনেক ছোট বাছাই করে চালিয়েছি এবং দেখেছি যে নতুন sortedঅনুলিপি সংস্করণটি এখনও 1000 দৈর্ঘ্যের এক ধরণের উপরে প্রায় 2% দীর্ঘ সময় চালায়।

পোকে নিজের কোডটিও চালিয়েছিলেন, এখানে কোডটি রয়েছে:

setup = '''
import random
random.seed(12122353453462456)
lst = list(range({length}))
random.shuffle(lst)
lists = [lst[:] for _ in range({repeats})]
it = iter(lists)
'''
t1 = 'l = next(it); l.sort()'
t2 = 'l = next(it); sorted(l)'
length = 10 ** 7
repeats = 10 ** 2
print(length, repeats)
for t in t1, t2:
    print(t)
    print(timeit(t, setup=setup.format(length=length, repeats=repeats), number=repeats))

তিনি 1000000 দৈর্ঘ্যের ধরণের জন্য খুঁজে পেয়েছিলেন, (100 বার দৌড়েছিলেন) একই রকম ফলাফল, তবে সময়ের প্রায় 5% বৃদ্ধি, এখানে ফলাফল:

10000000 100
l = next(it); l.sort()
610.5015971539542
l = next(it); sorted(l)
646.7786222379655

উপসংহার:

sortedএকটি অনুলিপি তৈরি করার সাথে একটি বৃহত আকারের তালিকাটি বাছাই করা সম্ভবত পার্থক্যগুলিকে প্রভাবিত করবে, তবে বাছাই করা নিজেই অপারেশনে আধিপত্য বজায় রাখবে এবং এই কোডগুলির মধ্যে আপনার কোডকে সংগঠিত করা অকাল অপ্টিমাইজেশন হতে পারে। আমার sortedযখন ডেটাগুলির একটি নতুন বাছাই করা তালিকা list.sortদরকার তখন আমি ব্যবহার করব এবং যখন আমার জায়গাটিতে কোনও তালিকা বাছাই করা দরকার তখন আমি ব্যবহার করব এবং এটি আমার ব্যবহার নির্ধারণ করুক।


4
জেনারেটর সেটআপটি দুর্দান্ত, তবে আপনি এই সিদ্ধান্তটি আঁকতে পারবেন না যে আপনি খুব দ্রুত কোনও কল্পকাহিনীকে ফাঁস করেছিলেন। সত্যটি রয়ে গেছে যে sorted()নতুন তালিকা অবজেক্ট বরাদ্দ করতে হবে এবং রেফারেন্সগুলি অনুলিপি করতে হবে; কোডের বাকি পথগুলি অভিন্ন। আপনি বৃহত্তর তালিকা সহ একই পরীক্ষা চালাতে পারবেন কিনা দেখুন। এটি কেবল তালিকার কপি তৈরির সাথে তুলনা করুন এবং আপনি যে পার্থক্যগুলি পেয়েছেন সেগুলি প্রতিলিপি করতে পারেন কিনা তা দেখুন
মার্টিজান পিটারস

11

মূল পার্থক্যটি এটি sorted(some_list)একটি নতুনlist ফেরত দেয় :

a = [3, 2, 1]
print sorted(a) # new list
print a         # is not modified

এবং some_list.sort(), তালিকায় স্থানটি সাজান :

a = [3, 2, 1]
print a.sort() # in place
print a         # it's modified

নোট করুন যেহেতু a.sort()কোনও কিছু ফেরত দেয় না, print a.sort()মুদ্রণ করবে None


List.sort () এর পরে কি কোনও তালিকা মূল অবস্থানগুলি পুনরুদ্ধার করা যায়?

না, কারণ এটি মূল তালিকাটি পরিবর্তন করে।


1
print a.sort()কিছুই মুদ্রণ করবে না।
বুরহান খালিদ

1
এটি মুদ্রণ করবে None, আমি এটি পরিষ্কার করব।
খ্রিস্টান

1

.Sort () ফাংশনটি সরাসরি তালিকারে নতুন তালিকার মান সঞ্চয় করে; সুতরাং আপনার তৃতীয় প্রশ্নের উত্তর হবে না। এছাড়াও আপনি যদি সাজানো (তালিকা) ব্যবহার করে এটি করেন, তবে আপনি এটি ব্যবহার করতে পারেন কারণ এটি তালিকা ভেরিয়েবলের মধ্যে সঞ্চয় নয়। এছাড়াও কখনও কখনও .sort () পদ্ধতিটি ফাংশন হিসাবে কাজ করে বা বলে যে এটি এতে যুক্তিযুক্ত।

আপনাকে বাছাই করা (তালিকা) এর মান স্পষ্টভাবে সংরক্ষণ করতে হবে।

এছাড়াও সংক্ষিপ্ত ডাটা প্রসেসিংয়ের জন্য গতির কোনও পার্থক্য থাকবে না; তবে দীর্ঘ তালিকার জন্য; আপনার দ্রুত কাজের জন্য .sort () পদ্ধতিটি ব্যবহার করা উচিত; তবে আবার আপনি অপরিবর্তনীয় ক্রিয়াগুলির মুখোমুখি হবেন।


".Sort () ফাংশনটি সরাসরি তালিকা ভেরিয়েবলের মধ্যে নতুন তালিকার মান সঞ্চয় করে" হু? কী নতুন তালিকা? কোনও নতুন তালিকা নেই। list.sort()পদ্ধতিতে জায়গা তালিকা বস্তুর বাছাই করে।
প্রধানমন্ত্রী 2Ring

এছাড়াও, এর অর্থ কী? "কখনও কখনও .sort () পদ্ধতিটি ফাংশন হিসাবে কাজ করে, বা বলে যে এটি এতে তর্ক করে।"
প্রধানমন্ত্রী 2Ring

নতুন তালিকার দ্বারা আমি যা বোঝাতে চাইছি তা হল পরিবর্তিত তালিকা এবং .sort () কেবল সেই পরিবর্তনশীল তালিকাটিকে একই ভেরিয়েবলের মধ্যে সঞ্চয় করে।
ভিক্রোবট

হ্যাঁ, একেবারে কখনও কখনও .sort()পদ্ধতি আর্গুমেন্ট নেয় এবং ফাংশন হিসাবে কাজ করে। এছাড়াও আমরা এটিকে পদ্ধতি বলি কারণ এটি তালিকার ডেটাটাইপের একটি বৈশিষ্ট্য।
ভিক্রোবট

যদি আমার ধারণায় কোনও রকম ভুল হয় তবে আমাকে বলুন, আমি এটি সন্ধান করব এবং আমার ধারণাগুলিও উন্নত করব, এবং আমার উত্তরও। ধন্যবাদ
ভিক্রোবট

1

কর্মের পার্থক্যটি দেখতে এখানে কয়েকটি সাধারণ উদাহরণ দেওয়া হয়েছে:

এখানে সংখ্যার তালিকা দেখুন:

nums = [1, 9, -3, 4, 8, 5, 7, 14]

sortedএই তালিকায় কল করার সময় , তালিকার sortedএকটি অনুলিপি তৈরি করবে। (অর্থ আপনার আসল তালিকাটি অপরিবর্তিত থাকবে))

দেখা যাক.

sorted(nums)

আয়

[-3, 1, 4, 5, 7, 8, 9, 14]

numsআবার তাকিয়ে আছে

nums

আমরা মূল তালিকাটি দেখতে পাচ্ছি (অপরিশোধিত এবং সাজানো নয়)) sortedমূল তালিকাটি পরিবর্তন করে নি

[1, 2, -3, 4, 8, 5, 7, 14]

একই numsতালিকাটি গ্রহণ করা এবং এতে sortফাংশন প্রয়োগ করা, আসল তালিকা পরিবর্তন করবে।

দেখা যাক.

numsনিশ্চিত করার জন্য আমাদের তালিকাটি দিয়ে শুরু করা , সামগ্রী এখনও একই।

nums

[-3, 1, 4, 5, 7, 8, 9, 14]

nums.sort()

এখন মূল সংখ্যাগুলির তালিকা পরিবর্তন করা হয়েছে এবং সংখ্যার দিকে তাকানো আমরা দেখতে পাচ্ছি যে আমাদের আসল তালিকাটি পরিবর্তিত হয়েছে এবং এখন তা সাজানো হয়েছে।

nums
[-3, 1, 2, 4, 5, 7, 8, 14]

আসল বনাম প্রতিলিপিটি আরও গভীরতার সাথে দেখানোর জন্য আপনাকে ধন্যবাদ
ব্রেন্ডন মেটকাল্ফ

0

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

সাজান () কোনও মান দেয় না।

বাছাই () পদ্ধতিটি কেবল একটি নির্দিষ্ট ক্রমে একটি প্রদত্ত তালিকার উপাদানগুলিকে সাজিয়ে তোলে - কোনও মান ফেরত না দিয়ে আরোহণ বা বর্ধন।

সাজানোর () পদ্ধতির সিনট্যাক্সটি হ'ল:

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

বিকল্পভাবে, আপনি একই উদ্দেশ্যে পাইথনের অন্তর্নির্মিত ফাংশন বাছাই করা () ব্যবহার করতে পারেন। সাজানো ফাংশন রিটার্ন সাজানো তালিকা

 list=sorted(list, key=..., reverse=...)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.