পাইথনের অন্তর্নির্মিত itertoolsমডিউলটিতে আসলে একটি groupbyফাংশন থাকে, তবে তার জন্য উপাদানগুলিকে শ্রেণিবদ্ধ করার জন্য প্রথমে এমনভাবে বাছাই করতে হবে যেগুলি তালিকাভুক্ত করতে হবে উপাদানগুলি:
from operator import itemgetter
sortkeyfn = itemgetter(1)
input = [('11013331', 'KAT'), ('9085267', 'NOT'), ('5238761', 'ETH'),
('5349618', 'ETH'), ('11788544', 'NOT'), ('962142', 'ETH'), ('7795297', 'ETH'),
('7341464', 'ETH'), ('9843236', 'KAT'), ('5594916', 'ETH'), ('1550003', 'ETH')]
input.sort(key=sortkeyfn)
এখন ইনপুটটি দেখে মনে হচ্ছে:
[('5238761', 'ETH'), ('5349618', 'ETH'), ('962142', 'ETH'), ('7795297', 'ETH'),
('7341464', 'ETH'), ('5594916', 'ETH'), ('1550003', 'ETH'), ('11013331', 'KAT'),
('9843236', 'KAT'), ('9085267', 'NOT'), ('11788544', 'NOT')]
groupbyফর্মের 2-টিউপলগুলির একটি ক্রম প্রদান করে (key, values_iterator)। আমরা যা চাই তা হ'ল ডিক্টের তালিকায় এটি পরিবর্তন করা যেখানে 'টাইপ' কী, এবং 'আইটেমস' হল মান_তালিকা দ্বারা ফিরে আসা টিউপসগুলির 0'th উপাদানগুলির একটি তালিকা। এটার মত:
from itertools import groupby
result = []
for key,valuesiter in groupby(input, key=sortkeyfn):
result.append(dict(type=key, items=list(v[0] for v in valuesiter)))
resultআপনার প্রশ্নে বর্ণিত হিসাবে এখন আপনার কাঙ্ক্ষিত ডিকটি রয়েছে।
আপনি বিবেচনা করতে পারেন, যদিও, কেবল এ থেকে একক ডিক তৈরি করে, টাইপ অনুসারে কীড করা এবং মানগুলির তালিকা সহ প্রতিটি মান। আপনার বর্তমান ফর্মটিতে, কোনও নির্দিষ্ট ধরণের মানগুলি খুঁজে পেতে, তালিকার সাথে পুনরাবৃত্তি করতে হবে 'মিল' টাইপ কীটি মিলবে এবং তারপরে এটি থেকে 'আইটেম' উপাদানটি পাবেন। আপনি যদি 1-আইটেমের ডিক্টের তালিকার পরিবর্তে একটি একক ডিক ব্যবহার করেন, তবে আপনি একটি নির্দিষ্ট ধরণের আইটেমগুলি মাস্টার ডিকের সাথে একক কীযুক্ত অনুসন্ধানের সাথে খুঁজে পেতে পারেন। ব্যবহার করে groupby, এটি দেখতে এই রকম হবে:
result = {}
for key,valuesiter in groupby(input, key=sortkeyfn):
result[key] = list(v[0] for v in valuesiter)
resultএখন এই resডিকটি রয়েছে (এটি @ কেনেনিটিএম এর উত্তরের মধ্যবর্তী ডিফল্টডিক্ট্টের অনুরূপ ):
{'NOT': ['9085267', '11788544'],
'ETH': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'],
'KAT': ['11013331', '9843236']}
(আপনি যদি এটি ওয়ান-লাইনারে হ্রাস করতে চান তবে আপনি এটি করতে পারেন:
result = dict((key,list(v[0] for v in valuesiter)
for key,valuesiter in groupby(input, key=sortkeyfn))
বা নতুনফাঙ্গলেড ডিক-বোধগম্য ফর্মটি ব্যবহার করে:
result = {key:list(v[0] for v in valuesiter)
for key,valuesiter in groupby(input, key=sortkeyfn)}
[('11013331', 'red', 'KAT'), ('9085267', 'blue' 'KAT')]যেখানে টিপলের শেষ উপাদানটি মূল এবং প্রথম দুটি মান হিসাবে হয়। ফলাফলটি এর মতো হওয়া উচিত: ফলাফল = [{প্রকার: 'কেএটি', আইটেম: [('11013331', লাল), ('9085267', নীল)]}]