Bdf*_*dfy 7 python dictionary list
我有日期对象的字典列表:
{ "begin" :date object1, "end" : date object2 }
....
{ "begin" :date object3, "end" : date object4 }
Run Code Online (Sandbox Code Playgroud)
我希望按条件简化此列表:
if cur.end == next.begin - datetime.timedelta(seconds=1))
cur.end = next.end
delete next
Run Code Online (Sandbox Code Playgroud)
怎么做 ?
我使用整数而不是日期时间对象来保持代码简单,但根据您的需要更改它很简单。在迭代集合时从集合中删除项目会破坏迭代器,因此您要么使用第二个列表(可能会占用大量内存),要么替换元素而不是删除它们。由于您的元素是字典,我认为用 None 替换要删除的元素是安全的,最后只需过滤掉 None 即可。
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
Run Code Online (Sandbox Code Playgroud)
由于第一个版本不能完全满足您的需求,请重复这些步骤,直到无法合并更多时间间隔。它效率低下,而且可能是当今最非 Python 的代码,但它完成了工作。
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
Run Code Online (Sandbox Code Playgroud)