【问题标题】:How to print nth line of a function output如何打印函数输出的第 n 行
【发布时间】:2019-01-20 03:27:42
【问题描述】:

如何打印第 n 行输出“a”?我尝试切片'a',但它不起作用。我似乎也无法遍历“a”。

A = [1,2,3]
B = []
C = []

def move(n, pegA, pegB, pegC):
    if n > 0:
        move(n - 1, pegA, pegC, pegB)
        target.append(pegA.pop())
        print(len(A), len(B), len(C))
        move(n - 1, pegC, pegB, pegA)

a = move(3, A, C, B)

a 返回以下输出:

2 0 1
1 1 1
1 2 0
0 2 1
1 1 1
1 0 2
0 0 3

我希望能够打印第二行,即 1 1 1。我应该改组函数“move”吗?

【问题讨论】:

  • 您是否尝试过将输出保存在列表中并从中打印所需的位置。
  • @manasdash 我将其称为 python 中的反模式。只需yield 让消费者决定
  • 感谢@user633183 的建议
  • @user633183:我同意yield 可能最适合生产代码,但这对我来说不像生产代码。对于 OP 和将来查看此问题的人们,我认为简洁和易于理解比性能和程序架构最佳实践更重要。
  • @lehiester 这不是性能问题;这是一个能够以除printing 之外的任何方式使用结果的问题......

标签: python recursion slice


【解决方案1】:

move 的结构方式不会保留其打印输出的任何记录,并且很难恢复。如果您需要按索引查找输出行,则可以改为返回包含每行输出的列表,如下所示:

def move(n, pegA, pegB, pegC, output_lines=None):
    if output_lines is None:
        output_lines = []
    if n > 0:
        move(n - 1, pegA, pegC, pegB, output_lines)
        target.append(source.pop())
        output_lines.append('%d %d %d' % (len(A), len(B), len(C)))
        move(n - 1, pegC, pegB, pegA, output_lines)
    return output_lines

a = move(3, A, C, B)

# print all lines of output
print('\n'.join(a))

# print 2nd line
print(a[1])

【讨论】:

  • 我会建议更优雅的解决方案,即实际使用您的返回值而不是忽略它们。让那个输入参数像一个全局变量一样感觉很奇怪。
  • @Mad Physicist:我不知道有一种方法可以连接每个递归调用的输出而不使其规模比 O(n) 更糟,但也许有办法。我同意这很丑。
  • @lehiester。是的,总是有不必要的内存破坏。
  • @MadPhysicist 我相信这是最好的解决方案。我想不出一种方法可以在只有returns 的递归函数中附加到“运行总计”列表。
  • @Tomothy。您按照拨打电话的相同顺序扩展列表。问题是它会在此过程中产生大量不必要的副本,而不是正常的摊销附加。
猜你喜欢
  • 2021-12-29
  • 2015-09-29
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
相关资源
最近更新 更多