在项目的一部分中,给定一个整数/字符x和一个元组/字符串a,我需要创建一个新的元组/字符串,它是由该元素扩展的原始元组/字符串。我目前的代码如下:
def extend(x, a):
if type(a) is tuple:
return a + (x,)
if type(a) is str:
return a + x
是否有更好的方法对其进行编码,使其更短或更适用于数据类型?
答案 0 :(得分:4)
目前尚不清楚为什么要在代码的同一部分扩展元组和字符串。可能你需要重构。 list
似乎是此类操作的正确类型,并且它已经.append(x)
。
如果您确定需要不同的类型,那么您的功能似乎没问题。但只需添加
raise TypeError()
最后。因此,您一定不要错过不可预测的数据类型。
答案 1 :(得分:3)
这样怎么样:
def extend(x, a):
return a + {tuple: (x,), str: x, list: [x]}[type(a)]
当然,请记住,数据类型的数量非常大,并且不存在 one-size-fits-all 方法。
所以,再仔细看看之前的代码,如果真的需要它,请使用这种字典方法。
修改强>
如果您需要多次执行此操作,请使用if
块执行此操作。正如@chepner所说,每次建立一本字典都会使这种方法过于聪明,无法实现自己的利益。
如果子类化也是一个问题,您应该从type
更改为isinstance
,如@ Jean-FrancoisFabre所说。
答案 2 :(得分:1)
Ev Kounis使用字典是原创的,但如果目的是为了获得速度,它并不真正起作用,因为字典每次都会被重建(x
变化)
稍作修改就是使用转换函数的字典。这个是固定的。 将参数传递给正确的转换函数并完成:
# this is built once
d = {tuple: lambda x:(x,), str: lambda x:x, list: lambda x:[x]}
def extend(x, a):
return a + d[type(a)](x)
(仍然无法正常传递子类类型的str
,tuple
,无论如何,但如果你确定你赢了&# 39; t,这有效)
老实说,使用3个密钥的字典不会那么快,if
链也同样有效。