पायथन के अंतर्निहित 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)
। हम जो चाहते हैं, वह इसे उन बिंदुओं की सूची में बदलना है जहां 'प्रकार' कुंजी है, और 'आइटम' मानों के द्वारा लौटाए गए tuples के 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))
या newfangled ताना-बोध रूप का उपयोग कर:
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 ', नीला)]}]