इस से अधिक आसान नहीं मिल करता है, मुझे लगता है:
a=[("13.5",100)]
b=[("14.5",100), ("15.5", 100)]
c=[("15.5",100), ("16.5", 100)]
input=[a,b,c]
from collections import Counter
print sum(
(Counter(dict(x)) for x in input),
Counter())
ध्यान दें कि Counter
(यह भी एक मल्टीसेट के रूप में जाना जाता है) अपने डेटा के लिए सबसे स्वाभाविक डेटा संरचना (सेट का एक प्रकार है जो करने के लिए तत्वों की हो सकती है है एक से अधिक बार, या समकक्ष - अर्थशास्त्र के साथ एक मानचित्र तत्व -> घटना गणना। आप इसे टुपल्स की सूचियों के बजाय पहले स्थान पर इस्तेमाल कर सकते थे।
इसके अलावा
संभव:
from collections import Counter
from operator import add
print reduce(add, (Counter(dict(x)) for x in input))
का उपयोग sum(seq, initialValue)
के बजाय reduce(add, seq)
आम तौर पर अधिक लचीला है और आप अनावश्यक प्रारंभिक मूल्य गुजर छोड़ देता है।
ध्यान दें कि आप राशि के बजाय मल्टीसेट्स के चौराहे को खोजने के लिए operator.and_
का भी उपयोग कर सकते हैं।
उपर्युक्त संस्करण बहुत धीमा है, क्योंकि प्रत्येक चरण पर एक नया काउंटर बनाया गया है। आइए इसे ठीक करें।
हम जानते हैं कि Counter+Counter
मर्ज किए गए डेटा के साथ एक नया Counter
देता है।यह ठीक है, लेकिन हम अतिरिक्त सृजन से बचना चाहते हैं। के Counter.update
बजाय उपयोग करते हैं:
अद्यतन (स्वयं, iterable = कोई नहीं, ** kwds) अनबाउंड collections.Counter विधि
dict.update तरह
(), लेकिन उन्हें जगह के बजाय मायने रखता है जोड़ें। स्रोत एक पुनरावर्तनीय, एक शब्दकोश, या एक अन्य काउंटर उदाहरण हो सकता है।
यही वही है जो हम चाहते हैं। आइए इसे reduce
के साथ संगत फ़ंक्शन के साथ लपेटें और देखें कि क्या होता है।
def updateInPlace(a,b):
a.update(b)
return a
print reduce(updateInPlace, (Counter(dict(x)) for x in input))
यह ओपी के समाधान से केवल मामूली धीमी है।
बेंचमार्क: http://ideone.com/7IzSx(अभी तक एक और समाधान के साथ अपडेट किया गया, astynax करने के लिए धन्यवाद)
(इसके अलावा: जो काम करता है lambda x,y: x.update(y) or x
द्वारा आप सख्त एक एक लाइनर चाहते हैं, आप updateInPlace
जगह ले सकता है वही तरीका और यहां तक कि एक दूसरे को विभाजित करने के लिए भी साबित होता है, लेकिन पठनीयता पर विफल रहता है। नहीं :-))
उपयोग 'काउंटर()' –
@AshwiniChaudhary: 'काउंटर()' केवल मौके की गणना करता है, और जैसा कि मान पहले से ही पहले से आबादी वाले हैं, यह इस परिदृश्य के लिए काम नहीं करेगा। –
@ क्रिस्टियनविट्स नीचे मेरा समाधान देखें। –