gpt4 book ai didi

python:自动区分list/tuple/array和int/float

转载 作者:行者123 更新时间:2023-11-28 20:43:51 29 4
gpt4 key购买 nike

我有一些对象可以是 float (或整数)或元组(或列表或数组)。是否可以使用惯用的 Python 来避免编写 if/elif 函数?现在我有

def f(attribute_a,attribute_b):
if type(attribute_a) == float or type(attribute_a) == int:
result = attribute_a + attribute_b
elif type(attribute_a) == list or type(attribute_a) == tuple or type(attribute_a) == array:
result = numpy.array([ attribute_a[i] + attribute_b[i] for i in range(len(attribute_a)) ])
return result

我想避免 elif 的东西,因为有时我希望 attribute_a 是一个 float ,而 attribute_b 是一个列表,在这种情况下,我想要类似的东西

result = numpy.array([ attribute_a + attribute_b[i] for i in range(len(attribute_b)) ])

因为我有五个不同的属性,所以不可能为每个可能的组合写出完整的 if 循环集,其中一个是数字,哪个是列表。

感谢任何帮助,谢谢,山姆

编辑,2015 年 1 月 23 日:一个想法是定义两个新函数如下

def general_value(x,i):
if type(x)==float or type(x)==int:
return x
elif type(x)==list or type(x)==tuple:
return x[i]
def general_len(x):
if type(x)==float or type(x)==int:
return 1
elif type(x)==list or type(x)==tuple:
return len(x)

(或对 isintance 等的各种概括),然后将它们插入到需要的地方。这是一个合理的黑客攻击,还是某种程度上的不恰当?

最佳答案

在可以传递类型元组的地方使用 isinstance 以避免多个 or 的:

if  isinstance(attribute_a,(int,float))
...
elif isinstance(attribute_a,(list,tuple, array)):

如果您只能有两种可能的情况,请使用 if/else:

  if  isinstance(attribute_a,(int,float))
result = ...
else:
result = ...

您可以使用条件表达式,但您的语句会相当长:

result =  attribute_a + attribute_b if isinstance(attribute_a,(int,float)) else numpy.array([ attribute_a[i] + attribute_b[i] for i in range(len(attribute_a)) ])

如果要检查一组可能匹配组合的两个属性:

if isinstance(attribute_a,(list,tuple,float) and isinstance(attribute_b,(float,list))):

另一种方法是存储 isinstance 的结果并否定检查以避免重复调用:

a,b = if isinstance(attribute_a,(list,tuple) ,isinstance(attribute_b,float))

if a and b:
...
elif a and not b:
...
else:
....

如果你想检查是否是元组、列表等,那么你可以使用:

from collections import Iterable
def check(ele):
return isinstance(ele,Iterable) and not isinstance(ele,basestring)

然后:

if check(attribute_a) and check(attribute_b):
.....

关于python:自动区分list/tuple/array和int/float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28115449/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com