对 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]}
我有一个脚本可以执行以下操作
- 减去字典键中的值
- 将数组转换为排序列表
- 从第二个值中减去第一个值
- 然后倒数第二个
- 等等。
问题是源数据中的某些值为空,这会引发 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]}