如何按条件简化词典列表?

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)

怎么做 ?

use*_*631 1

我使用整数而不是日期时间对象来保持代码简单,但根据您的需要更改它很简单。在迭代集合时从集合中删除项目会破坏迭代器,因此您要么使用第二个列表(可能会占用大量内存),要么替换元素而不是删除它们。由于您的元素是字典,我认为用 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)