2010-11-03 16 views
8

मैं थोड़ी देर के लिए इस पर कुछ भी नहीं कर रहा हूं ... कोई मदद बहुत अच्छी होगी सराहना की।शब्दकोशों की एक सूची को कई श्रेणियों में विभाजित करना

मेरे पास है:

[{'event': 0, 'voltage': 1, 'time': 0}, 
{'event': 0, 'voltage': 2, 'time': 1}, 
{'event': 1, 'voltage': 1, 'time': 2}, 
{'event': 1, 'voltage': 2, 'time': 3}, 
{'event': 2, 'voltage': 1, 'time': 4}, 
{'event': 2, 'voltage': 2, 'time': 5}, 
...] 

और मैं शब्दकोशों की उस सूची को विभाजित करने के प्रति घटना की तरह इस (वहाँ मनमाने ढंग से कई घटनाओं हो सकता है) ऊपर हैं:

list0 = [{'event': 0, 'voltage': 1, 'time': 0}, 
{'event': 0, 'voltage': 2, 'time': 1}] 

list1 = [{'event': 1, 'voltage': 1, 'time': 2}, 
{'event': 1, 'voltage': 2, 'time': 3}] 

list2 = [{'event': 2, 'voltage': 1, 'time': 4}, 
{'event': 2, 'voltage': 2, 'time': 5}] 

listN = ... 

उत्तर

10

उपयोग defaultdict

import collections 

result = collections.defaultdict(list) 

for d in dict_list: 
    result[d['event']].append(d) 

result_list = result.values() 

इस तरह, आपको इस बारे में कोई धारणा नहीं है कि कितने अलग हैं घटनाएं हैं या यदि कोई घटना गायब है।

यह आपको सूचियों की एक सूची देता है। यदि आप ईवेंट द्वारा अनुक्रमित dict चाहते हैं, तो शायद आप dict(d) का उपयोग करेंगे यदि आप कोई यादृच्छिक पहुंच करने की योजना बना रहे हैं।

जहां तक ​​व्यक्तिगत सूचियों का एक समूह बनाते हैं, मुझे लगता है कि यह एक बुरा विचार है। इसे ग्लोबल्स के रूप में बनाने या eval (या किसी अन्य तरीके से हैकी प्राप्त करने) की आवश्यकता होगी जबतक कि आपको पता न हो कि आप कितने होने का दावा नहीं कर रहे हैं। बस उन्हें एक कंटेनर में रखना सबसे अच्छा है।

+0

+1 मुझे डिफॉल्टडिक्ट के बारे में पता नहीं था। धन्यवाद! – dusan

+0

धन्यवाद, यह बहुत उपयोगी था! – thenickname

1
dict_list = [{'event': 0, 'voltage': 1, 'time': 0}, 
{'event': 0, 'voltage': 2, 'time': 1}, 
{'event': 1, 'voltage': 1, 'time': 2}, 
{'event': 1, 'voltage': 2, 'time': 3}, 
{'event': 2, 'voltage': 1, 'time': 4}, 
{'event': 2, 'voltage': 2, 'time': 5}, 
] 

import collections 
dol = collections.defaultdict(list) 
for d in dict_list: 
    k = d["event"] 
    dol[k].append(d) 

print dol 

यदि आप जानते हैं कि आपके "घटना" कुंजी लगातार शून्य आधारित पूर्णांक हैं, आप के बजाय एक सूची का उपयोग कर सकते हैं, लेकिन अतिरिक्त जटिलता आप कुछ भी हासिल नहीं कर सकते।

डिफ़ॉल्ट रंग पाइथन 2.5 में जोड़ा गया था, लेकिन पिछले संस्करणों के लिए कामकाज कठिन नहीं है (निक डी कोड देखें)।

1

मुझे लगता है कि आप वास्तव में क्या चाहते हैं उन्हें फिल्टर करने के लिए है:

elist = [{'event': 0, 'voltage': 1, 'time': 0}, 
{'event': 0, 'voltage': 2, 'time': 1}, 
{'event': 1, 'voltage': 1, 'time': 2}, 
{'event': 1, 'voltage': 2, 'time': 3}, 
{'event': 2, 'voltage': 1, 'time': 4}, 
{'event': 2, 'voltage': 2, 'time': 5}] 


from itertools import ifilter 

def get_events(elist, n): 
    return ifilter(lambda d: d['event'] == n , elist) 

for e in get_events(elist,0): 
    print e 

इस समाधान अतिरिक्त संरचना बनाने के नहीं होंगे। (विशाल घटना की सूची के मामले में लगता है)

एक और बहुत अच्छा समाधान GroupBy उपयोग करने के लिए है:

from itertools import groupby 
from operator import itemgetter 
for group in groupby(elist, itemgetter('event')): 
    id, event_list = group 
    for e in event_list: 
     print e 

{'time': 0, 'event': 0, 'voltage': 1} 
{'time': 1, 'event': 0, 'voltage': 2} 
{'time': 2, 'event': 1, 'voltage': 1} 
{'time': 3, 'event': 1, 'voltage': 2} 
{'time': 4, 'event': 2, 'voltage': 1} 
{'time': 5, 'event': 2, 'voltage': 2} 
+0

अच्छा बिंदु, धन्यवाद! – thenickname

2

यह एक प्रकार की वजह से O(n log n) है, लेकिन मैं बहुत ज्यादा चिंता नहीं होता जब तक कि वहाँ एक हैं सूची में बहुत आइटम।

यह सूची पहले से ही घटना द्वारा क्रमबद्ध है, आप इस तरह के पाठ्यक्रम को छोड़ सकते हैं।

>>> from operator import itemgetter 
>>> from itertools import groupby 
>>> d=[{'event': 0, 'voltage': 1, 'time': 0}, 
... {'event': 0, 'voltage': 2, 'time': 1}, 
... {'event': 1, 'voltage': 1, 'time': 2}, 
... {'event': 1, 'voltage': 2, 'time': 3}, 
... {'event': 2, 'voltage': 1, 'time': 4}, 
... {'event': 2, 'voltage': 2, 'time': 5}] 
>>> groupby(sorted(d, key=itemgetter('event')), key=itemgetter('event')) 
<itertools.groupby object at 0xb78138c4> 
>>> for x in _: 
... print x[0], list(x[1]) 
... 
0 [{'time': 0, 'event': 0, 'voltage': 1}, {'time': 1, 'event': 0, 'voltage': 2}] 
1 [{'time': 2, 'event': 1, 'voltage': 1}, {'time': 3, 'event': 1, 'voltage': 2}] 
2 [{'time': 4, 'event': 2, 'voltage': 1}, {'time': 5, 'event': 2, 'voltage': 2}] 
संबंधित मुद्दे