【问题标题】:TypeError NoneType when performing subtraction on dict values对dict值执行减法时的TypeError NoneType
【发布时间】:2017-06-19 22:30:30
【问题描述】:

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

  • 减去字典键中的值
  • 将数组转换为排序列表
  • 从第二个值中减去第一个值
  • 然后是第三个中的第二个
  • 等等。

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

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

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

【问题讨论】:

  • 您正在比较 None 类型。
  • 为什么不在处理前先删除无?
  • @John Coleman 此数据是从具有数千个键的 ESRI 要素类生成的。这只是其中的一小部分。每次运行脚本时都删除 Nones 是不可行的。
  • 我认为 laste 行也缩进了一级。
  • 在 Python 2 中,排序后所有的 None 都将位于列表的前面。把它们切掉。

标签: python nonetype


【解决方案1】:

您可以在排序后切掉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]}

【讨论】:

  • 谢谢约翰。我喜欢条件之前的修复。
【解决方案2】:

你显然不是要检查

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]

【讨论】:

  • 谢谢跳。您的解决方案有效,但我更喜欢 John Coleman 的条件之外的修复。
猜你喜欢
  • 2017-01-05
  • 2021-12-26
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多