python - রথম - বিজ্ঞান অভিধান




আমি অভিধানের একটি মান দ্বারা অভিধানগুলির একটি তালিকা সাজান কিভাবে? (12)

আমার অভিধানগুলির একটি তালিকা আছে এবং প্রতিটি আইটেমটি একটি নির্দিষ্ট সম্পত্তি মান অনুসারে সাজানো আছে।

নিচের অ্যারে বিবেচনা করুন,

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

name অনুসারে বাছাই করা উচিত

[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]


আপনি একটি কাস্টম তুলনা ফাংশন ব্যবহার করতে পারেন, অথবা আপনি একটি ফাংশন পাস করতে পারেন যা একটি কাস্টম বাছাই কী গণনা করে। এটি সাধারণত আরও কার্যকরী হয় যখন কী প্রতি আইটেমে একবার গণনা করা হয়, তুলনামূলক ফাংশনটিকে আরও বেশি বার বলা হবে।

আপনি এভাবে এটি করতে পারেন:

def mykey(adict): return adict['name']
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=mykey)

কিন্তু স্ট্যান্ডার্ড লাইব্রেরিতে ইচ্ছাকৃত বস্তুর আইটেমগুলি পাওয়ার জন্য একটি জেনেরিক রুটিন রয়েছে: itemgetter । সুতরাং পরিবর্তে এই চেষ্টা করুন:

from operator import itemgetter
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=itemgetter('name'))

আমি আপনি বোঝানো করেছি অনুমান:

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

এই মত সাজানো হবে:

sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))

আমি এই মত কিছু চেষ্টা:

my_list.sort(key=lambda x: x['name'])

এটা পাশাপাশি পূর্ণসংখ্যা জন্য কাজ।


এটি একটি cmp পরিবর্তে একটি কী ব্যবহার করে ক্লিনার দেখতে পারে:

newlist = sorted(list_to_be_sorted, key=lambda k: k['name']) 

বা JFSebastian এবং অন্যদের হিসাবে প্রস্তাবিত,

from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name')) 

সম্পূর্ণতা (fitzgeraldsteele দ্বারা মতামত হিসাবে নির্দিষ্ট হিসাবে), নিম্নমানের সাজানোর জন্য reverse=True যোগ করুন

newlist = sorted(l, key=itemgetter('name'), reverse=True)

কিছুক্ষন আমরা উদাহরণস্বরূপ lower() ব্যবহার করতে হবে

lists = [{'name':'Homer', 'age':39},
  {'name':'Bart', 'age':10},
  {'name':'abby', 'age':9}]

lists = sorted(lists, key=lambda k: k['name'])
print(lists)
# [{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}, {'name':'abby', 'age':9}]

lists = sorted(lists, key=lambda k: k['name'].lower())
print(lists)
# [ {'name':'abby', 'age':9}, {'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]

পার্ল থেকে Schwartzian রূপান্তর ব্যবহার করে,

py = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

করা

sort_on = "name"
decorated = [(dict_[sort_on], dict_) for dict_ in py]
decorated.sort()
result = [dict_ for (key, dict_) in decorated]

দেয়

>>> result
[{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]

পার্ল Schwartzian রূপান্তর আরও

কম্পিউটার বিজ্ঞানে, শাভারতজিয়ান ট্রান্সফর্মটি একটি পার্ল প্রোগ্রামিং প্রোগ্রামিং আইডিয়ম যা আইটেমগুলির একটি তালিকা সাজানোর দক্ষতা উন্নত করতে ব্যবহৃত হয়। এই idiom তুলনা-ভিত্তিক সাজানোর জন্য উপযুক্ত যখন ক্রম আসলে উপাদান একটি নির্দিষ্ট সম্পত্তি (মূল) ক্রম উপর ভিত্তি করে, যেখানে যে কম্পিউটিং কম্পিউটিং একটি নিবিড় অপারেশন যা অন্তত বার সঞ্চালিত করা উচিত। Schwartzian ট্রান্সফরম উল্লেখযোগ্য যে এটি নামযুক্ত অস্থায়ী অ্যারে ব্যবহার করে না।


প্যান্ডাস প্যাকেজটি ব্যবহার করা আরেকটি পদ্ধতি, যদিও এটি অন্যের প্রস্তাবিত আরও প্রচলিত পদ্ধতির চেয়ে বড় আকারের রানটাইম অনেক ধীর।

import pandas as pd

listOfDicts = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
df = pd.DataFrame(listOfDicts)
df = df.sort_values('name')
sorted_listOfDicts = df.T.to_dict().values()

এখানে একটি ছোট তালিকা এবং একটি বড় (100k +) ডিক্টগুলির তালিকাগুলির জন্য কিছু বেঞ্চমার্ক মান রয়েছে:

setup_large = "listOfDicts = [];\
[listOfDicts.extend(({'name':'Homer', 'age':39}, {'name':'Bart', 'age':10})) for _ in range(50000)];\
from operator import itemgetter;import pandas as pd;\
df = pd.DataFrame(listOfDicts);"

setup_small = "listOfDicts = [];\
listOfDicts.extend(({'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}));\
from operator import itemgetter;import pandas as pd;\
df = pd.DataFrame(listOfDicts);"

method1 = "newlist = sorted(listOfDicts, key=lambda k: k['name'])"
method2 = "newlist = sorted(listOfDicts, key=itemgetter('name')) "
method3 = "df = df.sort_values('name');\
sorted_listOfDicts = df.T.to_dict().values()"

import timeit
t = timeit.Timer(method1, setup_small)
print('Small Method LC: ' + str(t.timeit(100)))
t = timeit.Timer(method2, setup_small)
print('Small Method LC2: ' + str(t.timeit(100)))
t = timeit.Timer(method3, setup_small)
print('Small Method Pandas: ' + str(t.timeit(100)))

t = timeit.Timer(method1, setup_large)
print('Large Method LC: ' + str(t.timeit(100)))
t = timeit.Timer(method2, setup_large)
print('Large Method LC2: ' + str(t.timeit(100)))
t = timeit.Timer(method3, setup_large)
print('Large Method Pandas: ' + str(t.timeit(1)))

#Small Method LC: 0.000163078308105
#Small Method LC2: 0.000134944915771
#Small Method Pandas: 0.0712950229645
#Large Method LC: 0.0321750640869
#Large Method LC2: 0.0206089019775
#Large Method Pandas: 5.81405615807

যদি আপনি একাধিক কী দ্বারা তালিকাটি সাজান করতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন:

my_list = [{'name':'Homer', 'age':39}, {'name':'Milhouse', 'age':10}, {'name':'Bart', 'age':10} ]
sortedlist = sorted(my_list , key=lambda elem: "%02d %s" % (elem['age'], elem['name']))

এটি তুলনামূলকভাবে হ্যাকিশ, যেহেতু এটি তুলনা করার জন্য মানগুলিকে একক স্ট্রিং উপস্থাপনাতে রূপান্তরিত করে তবে এটি নেতিবাচকগুলির সাথে সংখ্যার জন্য প্রত্যাশিত হিসাবে কাজ করে (যদিও আপনি যদি সংখ্যাগুলি ব্যবহার করেন তবে আপনার পংক্তিটি যথাযথভাবে শূন্য প্যাডিংয়ের সাথে বিন্যাস করতে হবে)



import operator

কী = 'নাম' দ্বারা অভিধান তালিকা সাজানোর জন্য:

list_of_dicts.sort(key=operator.itemgetter('name'))

কী = 'বয়স' দ্বারা অভিধান তালিকা সাজানোর জন্য:

list_of_dicts.sort(key=operator.itemgetter('age'))

a = [{'name':'Homer', 'age':39}, ...]

# This changes the list a
a.sort(key=lambda k : k['name'])

# This returns a new list (a is not modified)
sorted(a, key=lambda k : k['name']) 






data-structures