方便的方法使新元组/字符串扩展1

时间:2018-03-21 16:17:52

标签: python python-3.x

在项目的一部分中,给定一个整数/字符x和一个元组/字符串a,我需要创建一个新的元组/字符串,它是由该元素扩展的原始元组/字符串。我目前的代码如下:

def extend(x, a):
    if type(a) is tuple:
        return a + (x,)
    if type(a) is str:
        return a + x

是否有更好的方法对其进行编码,使其更短或更适用于数据类型?

3 个答案:

答案 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)

(仍然无法正常传递子类类型的strtuple,无论如何,但如果你确定你赢了&# 39; t,这有效)

老实说,使用3个密钥的字典不会那么快,if链也同样有效。