对 dict 值执行减法时出现 TypeError NoneType

TypeError NoneType when performing subtraction on dict values

我有一个脚本可以执行以下操作

问题是源数据中的某些值为空,这会引发 TypeError。我试图抛出一个条件,但它仍然试图减去 Nones。

这是带有一些示例数据的代码:

eLinks = {'726122193.0': [1310, 1315, 1320, 1325, 1330, 1335, 1340, 1310, 1315, 1320, 1325, 1330, 1335, 1340, 1310, 1315, 1320, 1325, 1330, 1335, 1340, 1310, 1315, 1320, 1325, 1330, 1335, 1340, 1310, 1315, 1320, 1325, 1330, 1335, 1340, 1310, 1315, 1320, 1325, 1330, 1335, 1340, 1310, 1315, 1320, 1325, 1330, 1335, 1340, 1310, 1315, 1320, 1325, 1330, 1335, 1340, 1310, 1315, 1320, 1325, 1330, 1335, 1340, 1310, 1315, 1320, 1325, 1330, 1335, 1340, 1310, 1315, 1320, 1325, 1330, 1335, 1340, 1310, 1315, 1320, 1325, 1330, 1335, 1340, 1310, 1315, 1320, 1325, 1330, 1335, 1340], '23607015.0': [None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None, None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None, None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None, None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None, None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None, None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None, None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None, None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None, None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None, None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None, None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None, None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None, None, None, None, 90, 95, 130, 2070, None, None, None, 580, 585, 610, 615, 2355, 2360, 1945, 1950, 125, 130, None, None, None]}

eOut = {}
for key, lis in eLinks.iteritems():
    eCheck = []
    sLis = sorted(lis)
    for i, _ in enumerate(sLis[:-1]):
        if i is not None:
            dif = sLis[i+1] - sLis[i]
            if dif > 20:
                eCheck.append(dif)
            eOut[key] = eCheck

你显然不是要检查

if i is not None:

i 永远不会是 None(它来自 enumerate),而您要确保 sLis[i+1]sLis[i] 都不是 None.

直接的错误修复是将上面的行替换为:

if sLis[i+1] is not None and sLis[i] is not None:

更干净的版本应该是这样的:

e_links = {'726122193.0': [1310, 1315, 1320, …

result = {}
for key, links in e_links.iteritems():
    links = sorted(l for l in links if l is not None)
    pairs = zip(links, links[1:])
    result[key] = [b-a for a, b in pairs if b-a>20]

您可以在排序后切掉 None 值,然后不必担心在内循环中识别 None

eOut = {}
for key, lis in eLinks.iteritems():
    eCheck = []
    sLis = sorted(lis)
    sLis = sLis[sLis.count(None):]
    for i, _ in enumerate(sLis[:-1]):
        dif = sLis[i+1] - sLis[i]
        if dif > 20:
            eCheck.append(dif)
            eOut[key] = eCheck

根据您的示例数据,eOut 变为:

{'23607015.0': [30, 450, 25, 1330, 120, 285]}