【问题标题】:Python recursive string concatenationPython递归字符串连接
【发布时间】:2015-06-16 19:08:03
【问题描述】:

我正在使用一个 python 类来生成一个用于日历每日视图的 HTML 表格。为了生成表格,我递归地调用我的函数,直到它到达所需的结尾。我看起来是这样的:

# By default time=[0][0] and end_time=[0][24]
---------------------------------------------
def makeRows(self, time, end_time): # time/end_time = [min][hour] 
        row = ['<tr><td>']
        if time[1] == end_time[1]:  # Base case
            # String format
            if time[0] == 0:
                row.append('%s:00' % time[1])
            else:
                row.append('%s:%s' % (time[1], time[0]))

            row.append('</td></tr>')

            return format_html(''.join(row))
        else:   # Recursive case

            if time[0] == 0 and time[1] == 0: # First row
                row.append('0:00')
                row.append('</td><td rowspan="97"><div class="day_event_container"></div></td></tr>')
            else:
                # String format
                if time[0] == 0:
                    row.append('%s:00' % time[1])
                else:
                    row.append('%s:%s' % (time[1], time[0]))

                row.append('</td></tr>')

            return format_html(''.join(row)+self.makeRows(self.increaseTime(time), end_time))

def increaseTime(self, time):
        hour = time[1]
        minute = time[0]

        if minute == 0:
            minute+= 30
        else:
            hour += 1
            minute = 0

        return [minute, hour]

我最近将所有字符串连接从 += 更改为 ''.join(),但唯一的“天真”连接在我的递归调用中。

该函数通常被调用48次以从0:00-&gt;24:00生成行

我的递归调用中的“朴素”连接对于 48 个函数调用真的那么昂贵吗?

如果我的 ''naive'' 连接实际上非常昂贵,我将如何替换它?

我试过了

return format_html(''.join(row).join(self.makeRows(self.increaseTime(time), end_time)))

但这会抛出Exception Type: MemoryError,我猜它只是溢出了堆或堆栈或它存储的任何地方。

最后,我对 python 还是很陌生,我 99% 确信这与 python 的做事方式相去甚远。那么有没有更pythonic的方式来生成从0:0024:00的每日日历视图?

【问题讨论】:

  • 你能把完整的代码吗? self.increaseTime() 是做什么的,timeendtime 最初是什么?
  • @AnandSKumar 编辑了问题以便更好地理解。 inceaseTime 只是将时间增加了 30 分钟
  • 另一个问题,是使用join 导致MemoryError 吗?然而,使用 + 不会导致它?
  • @AnandSKumar yes 使用第二个join 会导致MemoryError

标签: python recursion string-concatenation


【解决方案1】:

在我看来,您正在尝试替换 -

format_html(''.join(row)+self.makeRows(self.increaseTime(time), end_time))

format_html(''.join(row).join(self.makeRows(self.increaseTime(time), end_time)))

但这是不正确的,两者都返回不同的东西。让我们举一个非常简单的例子来解释-

>>> ''.join('Bye').join('Hello')
'HByeeByelByelByeo'
>>> ''.join('Bye') + 'Hello'
'ByeHello'

我认为你应该保持你当前对+ 连接运算符的使用,而不是试图让它表现得更好,除非你正在处理一个非常大的要连接的字符串列表,这似乎不是那种情况。

【讨论】:

  • ''.join(row) 是必需的,因为行是列表而不是字符串
  • 好的,是的,刚刚注意到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 2017-04-06
  • 2020-07-19
相关资源
最近更新 更多