对不带字符串值的python列表求和

对不带字符串值的python列表求和,python,Python,因此,根据duck typing advice,不建议您在python中检查类型,只需查看操作是否成功。在这种情况下,如何对(主要)数字列表求和,同时忽略字符串 sum([1,2,3,4,'']) #fails sum(filter(lambda x: type(x)==int, [1,2,3,4,''])) #bad style 我在这里看到两个主要的解决方案: 预处理:过滤输入数据以防止出现“缺失数据”,这可能相当复杂。如果没有更多的信息,我们在这一点上帮不了你 后期处理:过滤结果列表并

因此,根据duck typing advice,不建议您在python中检查类型,只需查看操作是否成功。在这种情况下,如何对(主要)数字列表求和,同时忽略字符串

sum([1,2,3,4,'']) #fails
sum(filter(lambda x: type(x)==int, [1,2,3,4,''])) #bad style

我在这里看到两个主要的解决方案:

  • 预处理:过滤输入数据以防止出现
    “缺失数据”
    ,这可能相当复杂。如果没有更多的信息,我们在这一点上帮不了你
  • 后期处理:过滤结果列表并删除
    “缺少的数据”
    ,这很容易,但实际上不可扩展
关于后处理,这里有一个使用列表理解的解决方案,另一个使用基于
过滤器的方法:

a = [1,2,3,4,'']
filtered_a = [x for x in t if isinstance(x, int)]
filtered_a = filter(lambda x: isinstance(x, int), a)
然后,您只需执行
sum(过滤的)


我们还可以说,您可以在处理过程中检查数据的一致性,而不必在数组中添加字符串。

我在这里看到两个主要解决方案:

  • 预处理:过滤输入数据以防止出现
    “缺失数据”
    ,这可能相当复杂。如果没有更多的信息,我们在这一点上帮不了你
  • 后期处理:过滤结果列表并删除
    “缺少的数据”
    ,这很容易,但实际上不可扩展
关于后处理,这里有一个使用列表理解的解决方案,另一个使用基于
过滤器的方法:

a = [1,2,3,4,'']
filtered_a = [x for x in t if isinstance(x, int)]
filtered_a = filter(lambda x: isinstance(x, int), a)
然后,您只需执行
sum(过滤的)


我们还可以争辩说,您可以在处理过程中检查数据的一致性,只是不要在数组中添加字符串。

我将这样做

a = [1,2,3,4,'']
print sum(x if not isinstance(x,str) else 0 for x in a)

我会这样做的

a = [1,2,3,4,'']
print sum(x if not isinstance(x,str) else 0 for x in a)


为什么要把字符串和数字混在一起?我想这是一个很有见地的问题,因为我基本上把字符串看作是“丢失的数据”。这当然会导致一些问题,比如sum(filter(lambda x:type(x)=int,['','','')==0,而如果列表中的所有字符串都是“”,那么它应该是非的,那么你可以使用
sum([v代表v在[1,2,3,4]中,如果v])
。为什么字符串与数字混合在一起?我想这是一个有深刻见解的问题,因为我本质上是把字符串当作“丢失的数据”。这当然会导致一些问题,比如sum(filter(lambda x:type(x)=int,['','','')==0,但是如果列表中的所有字符串都是“”,那么它应该是非的,那么你可以使用
sum([v代表v in[1,2,3,4],如果v])
。额外的
[]
sum()
中是不需要的。谢谢大家=D它已经修复了!最好的方法不是使用类型,而是使用isinstance调用。使用类型的陷阱是,将来可能有人会将int子类化,那么您的代码将无法工作。因此+1表示感谢。是的,iInstance可能更好。但我想这仍然是“三思而后行”。是的,我可能最好对丢失的数据使用None,然后sum几乎可以正常工作,尽管这个“sum”等价物更好(为格式错误道歉)
def sensible_sum(l):“将None视为NA,例如,如果l=[]或l=[None,None]返回None”'l=过滤器(lambda x:x不是None,l)返回reduce(lambda x,y:(x或0)+y,l,None)
总和()中不需要额外的
[]
.Thank guys=D这是固定的!最好的方法不是使用类型,而是使用isinstance调用。使用类型的陷阱是,将来有人可能会将int子类化,然后你的代码将无法工作。因此,感谢+1。isinstance可能更好,是的。但我想它仍然是“三思而后行”。是的,我可能更好地使用“无”表示缺少数据,那么sum几乎可以正常工作,尽管此“sum”等价物更好(为格式错误表示歉意)
def sensible_sum(l):“将无视为NA,例如,如果l=[]或l=[None,None]返回无”,“l=过滤器(lambda x:x不是无,l)返回reduce(lambda x,y:(x或0)+y,l,None)
我选择这个作为答案,因为即使列表中有(例如)浮动,它也能处理(虽然我知道这不在原始问题中)。我有这个想法,这就是为什么这样回答。我选择这个作为答案,因为即使列表中有(例如)浮动,它也能处理(虽然我知道这不在原始问题中).我心里有这个想法,这就是为什么我会这样回答。