TypeError:只能将元组(不是“list”)连接到元组“

时间:2012-05-08 21:37:32

标签: python

我根据每位用户的平均收入(ARPU),保证金以及客户保留客户的年数(ltvYears)编写了一个简单的脚本来模拟客户终身价值(LTV)。下面是我的脚本。它在此行抛出错误“ltvYears = ltvYears + [ltv_loop]”。错误消息是“TypeError:只能将元组(不是”列表“)连接到元组”。有人能告诉我是什么原因引起的吗?我怀疑问题可能源于“ltvYears =('f',[])”我添加了类型代码以消除另一个错误(将浮点乘以int)。

我是Python的新手,所以在这段代码中很可能会出现初学者错误。

lowYears = 0
highYears = 20
modeYears = 3
ARPU = 65.0*12.0
MARGIN = .30
ltvYears = ('f',[])
ltv = []

def ltv(arpu, years, margin):
    return arpu * years * margin

N = 10000    
for n in range(N):
    #estimate LTV
    ltv_loop = random.triangular(lowYears, highYears, modeYears) 
    ltvYears = ltvYears + [ltv_loop]
    ltv = ltv + [ltv(ARPU, ltvYears, MARGIN)]

show = 0

if (show==1):
    #plot ltv histogram
    plt.hist(ltv,bins=10)
    plt.title("LTV Probability Density")
    plt.xlabel("")
    plt.ylabel("$")
    plt.show()

编辑 - 这是我的变量的屏幕截图。 enter image description here

EDIT2 ---由于下面的帮助,我找到了解决方案。共有三个问题:

  1. 我错误地将相同的名称分配给变量和函数(+1 @autopopulated用于指出它)
  2. 此行无关紧要“ltvYears = ltvYears + [ltv_loop]”
  3. 此行应使用“ltv_loop”用于第二个参数“ltv = ltv + [calculateltv(ARPU,ltv_loop,MARGIN)]”
  4. +1 @DonCallisto和@RikPoggi获取有关第2项和第3项的帮助

5 个答案:

答案 0 :(得分:10)

ltvYears是一个元组,它被定义为

ltvYears = ('f',[])

所以说到这一行:

ltvYears = ltvYears + [ltv_loop]

Python不知道该怎么做,因为你的错误明确告诉我们:

  

“TypeError:只能将元组(不是”list“)连接到元组”

不清楚该行的行为应该是什么,因此很难提出解决方案。

也许您只需要将ltvYears定义为list并调用.append方法。


修改

OP表示:{p> Here

  

ltvYears = ('f',[])我添加了'f'来表示该数组要包含浮点数。在我这样做之前,我得到了关于乘法浮点数和整数的错误。

你不需要这样做。 Python不是C。

只是做:

ltvYears = []

以后:

ltvYears.append(ltv_loop)

答案 1 :(得分:5)

如果ltvYears是一个元组,那么你可以这样连接:

ltvYears += (ltv_loop,)

答案 2 :(得分:2)

从您的代码中

ltvYears = ltvYears + [ltv_loop]

ltvYears是一个元组,这就是你得到错误的原因。

那是因为你不能将list附加到元组。也许您必须更改ltvYears的类型,使其成为列表

答案 3 :(得分:2)

(这与你所询问的问题不同,请参阅@ Rik的回答,但你也遇到了这个问题)

您已定义了一个与变量同名的函数:

...
ltv = []

def ltv(arpu, years, margin):
    return arpu * years * margin
...

这将用函数对象替换你的列表变量,当然你无法追加,所以这一行会失败:ltv = ltv + [ltv(ARPU, ltvYears, MARGIN)]

答案 4 :(得分:0)

它实际上就像错误消息所说的那样简单:不允许连接列表和元组。

ltvYears是一个元组。 [ltv_loop]是一个列表。