【问题标题】:TypeError: can only concatenate tuple (not "list") to tuple"TypeError:只能将元组(不是“列表”)连接到元组”
【发布时间】:2012-05-09 06:01:56
【问题描述】:

我编写了一个简单的脚本来根据每用户平均收入 (ARPU)、利润和客户保持客户的年数 (ltvYears) 来模拟客户生命周期价值 (LTV)。下面是我的脚本。它在“ltvYears = ltvYears + [ltv_loop]”这一行引发错误。错误消息是“TypeError: can only concatenate tuple (not "list") to tuple”。有人可以告诉我是什么原因造成的吗?我怀疑问题可能源于“ltvYears = ('f',[])”,我在其中添加了类型代码以消除另一个错误(将 float 乘以 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()

编辑 - 这是我的变量的屏幕截图。

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

  1. 我错误地将相同的名称分配给变量和函数(+1 @autopopulated 指出这一点)
  2. 这一行是多余的“ltvYears = ltvYears + [ltv_loop]”
  3. 这一行本应使用“ltv_loop”作为第二个参数“ltv = ltv + [calculateltv(ARPU, ltv_loop, MARGIN)]”

+1 @DonCallisto 和 @RikPoggi 对项目 2 和 3 的帮助

【问题讨论】:

  • 发布整个错误信息,这比将其拆分成文本更清晰。
  • “我在哪里添加了类型代码”错误...“类型代码”是什么意思?
  • @Lattyware 我正在寻找更具描述性的错误消息。我提出的问题是我从 Pyscripter(我必须在这台机器上使用)得到的全部内容。
  • @MarkByers 我指的是 ltvYears = ('f',[])。我添加了“f”以指示该数组将包含浮点数。在我这样做之前,我遇到了一个关于将浮点数和整数相乘的错误。
  • @hughesdan:“数组”是什么意思?那是一个元组,而不是一个数组。 'f' 如何表示它包含浮点数?对我来说,它看起来像是包含一个字符串和一个列表。

标签: python


【解决方案1】:

ltvYears 是一个元组,它的定义是这样的

ltvYears = ('f',[])

所以当谈到这一行时:

ltvYears = ltvYears + [ltv_loop]

Python 不知道该怎么做,正如您的错误清楚地表明的那样:

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

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

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


编辑

Here OP 说:

ltvYears = ('f',[]) 我添加了'f' 以表明该数组将包含浮点数。在我这样做之前,我遇到了一个关于将浮点数和整数相乘的错误。

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

只要做:

ltvYears = []

及以后:

ltvYears.append(ltv_loop)

【讨论】:

    【解决方案2】:

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

    ltvYears += (ltv_loop,)
    

    【讨论】:

      【解决方案3】:

      (这与您要问的问题不同,请参阅@Rik 的答案,但您也遇到了这个问题)

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

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

      这会将您的列表变量替换为函数对象,当然您不能附加到该函数对象,因此该行将失败:ltv = ltv + [ltv(ARPU, ltvYears, MARGIN)]

      【讨论】:

        【解决方案4】:

        来自您的代码

        ltvYears = ltvYears + [ltv_loop]
        

        ltvYears 是一个元组,这就是您收到该错误的原因。

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

        【讨论】:

        • 很可能,它的定义就像一个元组:ltvYears = ('f',[])
        • @RikPoggi :通过再次阅读问题,我注意到了这一点,并且在你告诉我之前我只更新了 uSecond :)
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多