2015-10-02 22 views
7

मैं तारीख वस्तुओं के शब्दकोशों की सूची है:हालत से शब्दकोशों की सूची को सरल कैसे बनाएं?

{ "begin" :date object1, "end" : date object2 } 
.... 
{ "begin" :date object3, "end" : date object4 } 

मैं हालत से इस सूची को आसान बनाने में करना चाहते हैं:

if cur.end == next.begin - datetime.timedelta(seconds=1)) 
    cur.end = next.end 
    delete next 

यह कैसे करना है?

+0

और तुम कैसे पिछले एक आसान बनाने होगा? –

+1

http://stackoverflow.com/questions/5434891/iterate-a-list-as-pair-current-next-in-python –

+1

इससे आपको बहुत मदद मिलेगी। अन्यथा, उस सूची की प्रतिलिपि पर पुनरावृत्ति करें अन्यथा, आप सूची को पुन: करते समय अगली बार हटा नहीं सकते ;-) –

उत्तर

1

मैं कोड को सरल रखने के लिए डेटाटाइम ऑब्जेक्ट्स के बजाय पूर्णांक का उपयोग करता हूं, लेकिन यह आपकी आवश्यकताओं के लिए इसे बदलने के लिए छोटा है। इसे पुनरावृत्त करते समय संग्रह से आइटम्स को हटाना इटेटरेटर को तोड़ देगा, इसलिए आप या तो दूसरी सूची का उपयोग कर सकते हैं (स्मृति गहन हो सकता है) या आप उन्हें हटाने के बजाय तत्वों को प्रतिस्थापित करते हैं। चूंकि आपके तत्व शब्दकोश हैं, मैंने सोचा कि तत्व को प्रतिस्थापित करने के लिए किसी के साथ हटाया जाना सुरक्षित है और अंत में केवल नोन्स को फ़िल्टर करें।

l=[ 
{ "b" : 1, "e" : 2}, 
{ "b" : 3, "e" : 5}, 
{ "b" : 6, "e" : 7}, 
{ "b" : 10, "e" : 12}, 
{ "b" : 13, "e" : 20} 
] 

for i in xrange(len(l) - 1): 
    cur = l[i] 
    if not cur: 
     continue 
    next = l[i + 1] 
    if cur["e"] == next["b"] - 1: 
     cur["e"] = next["e"] 
     l[i+1] = None 

l = filter(None, l) 
print l 

चूंकि पहला संस्करण आपकी आवश्यकताओं को पूरी तरह से पूरा नहीं करता है, तब तक चरणों को दोहराएं जब तक कि कोई और समय अंतराल विलय नहीं किया जा सके। यह आज अक्षम और संभावित रूप से कोड का सबसे गैर-पायथनिक टुकड़ा है, लेकिन यह काम करता है।

changed = True 
while changed: 
    changed = False 
    l = filter(None, l) 
    for i in xrange(len(l) - 1): 
     cur = l[i] 
     if cur is None: 
      continue 
     next = l[i + 1] 
     if cur["e"] == next["b"] - 1: 
      cur["e"] = next["e"] 
      l[i+1] = None 
      changed = True 

l = filter(None, l) 
print l 
+0

परिणाम होना चाहिए [{'b': 1, 'e': 7}, {'b': 10, 'e ': 20}, {' बी ': 22,' ई ': 24}], नहीं [{' बी ': 1,' ई ': 5}, {' बी ': 6,' ई ': 7}, {'बी': 10, 'ई': 20}, {'बी': 22, 'ई': 24}] – Bdfy

+0

@ बीडीएफ मुझे नहीं पता कि {'b': 22, 'e': 24 कहां है } से आते हैं। मैं इसे अपने आउटपुट में नहीं देखता हूं – user1514631

1

की तरह अन्य जवाब में बताया गया है, आप इसे ऊपर पुनरावृत्ति जबकि सूची में से एक तत्व को हटाना नहीं चाहिए, यह मुद्दों के बहुत सारे करने के लिए नेतृत्व कर सकते हैं। एक अन्य विधि है कि बनाता है एक पूरी तरह से नई सूची होगा -

import datetime 
lisdic = [] #list of dictionaries 
prev = None 
result = [] 
for i in lisdic: 
    if not prev: 
     prev = i 
    elif prev['end'] == i['begin'] - datetime.timedelta(seconds=1): 
     prev['end'] = i['end'] 
    else: 
     result.append(prev) 
     prev = i 
if prev: 
    result.append(prev) 

यह भी कई शब्दकोशों भर में समान अंतराल संभाल हैं (एक उदाहरण नीचे डेमो में सूची में पहले 3 शब्दकोशों जा रहा है)।

डेमो -

>>> import datetime 
>>> lisdic = [{"begin":datetime.datetime(2015,10,2,10,0,0),"end":datetime.datetime(2015,10,2,10,30,0)}, 
... {"begin":datetime.datetime(2015,10,2,10,30,1),"end":datetime.datetime(2015,10,2,11,0,0)}, 
... {"begin":datetime.datetime(2015,10,2,11,0,1),"end":datetime.datetime(2015,10,2,12,0,0)}, 
... {"begin":datetime.datetime(2015,10,3,10,0,0),"end":datetime.datetime(2015,10,3,10,30,0)}, 
... {"begin":datetime.datetime(2015,10,3,11,0,0),"end":datetime.datetime(2015,10,3,11,30,0)}, 
... {"begin":datetime.datetime(2015,10,4,12,0,0),"end":datetime.datetime(2015,10,2,12,10,0)}] 
>>> prev = None 
>>> result = [] 
>>> for i in lisdic: 
...  if not prev: 
...   prev = i 
...  elif prev['end'] == i['begin'] - datetime.timedelta(seconds=1): 
...   prev['end'] = i['end'] 
...  else: 
...   result.append(prev) 
...   prev = i 
... 
>>> 
>>> if prev: 
...  result.append(prev) 
... 
>>> pprint.pprint(result) 
[{'begin': datetime.datetime(2015, 10, 2, 10, 0), 
    'end': datetime.datetime(2015, 10, 2, 12, 0)}, 
{'begin': datetime.datetime(2015, 10, 3, 10, 0), 
    'end': datetime.datetime(2015, 10, 3, 10, 30)}, 
{'begin': datetime.datetime(2015, 10, 3, 11, 0), 
    'end': datetime.datetime(2015, 10, 3, 11, 30)}, 
{'begin': datetime.datetime(2015, 10, 4, 12, 0), 
    'end': datetime.datetime(2015, 10, 2, 12, 10)}] 
संबंधित मुद्दे