【问题标题】:Can python recognise patterns in the printed statements while printing more than one line in a function?python可以在一个函数中打印多行时识别打印语句中的模式吗?
【发布时间】:2021-04-25 08:53:38
【问题描述】:

我有一个函数可以一个接一个地打印一堆行。它接受不同符号的输入,然后根据 if 条件将列表中的字符串 obj 替换为这些符号。

例如:

original_string = ["|-----", "|-----", "|-----", "|-----", "|-----"]

my_list = ['*', '+']


def foo(my_list):
    new_string = original_string[:]
    for i in range(len(original_string)):
        # The following if condition changes often to print different patterns.
        # I've evaluated it to give an even integer for simplicity purposes
        if i % 2 == 0:
            new_string.pop(i)
            new_string.insert(i, f"|--{my_list[0]}--")
        print(new_string)


foo(my_list)

我得到以下输出:

['|--*--', '|-----', '|-----', '|-----', '|-----']
['|--*--', '|-----', '|-----', '|-----', '|-----']
['|--*--', '|-----', '|--*--', '|-----', '|-----']
['|--*--', '|-----', '|--*--', '|-----', '|-----']
['|--*--', '|-----', '|--*--', '|-----', '|--*--']

我的问题是:如何让 python 程序识别生成了哪些输出模式并采取相应措施?

我正在寻找类似这样的东西:

这是我的实际代码输出:

Output pattern I want to recognise:

Pattern A:
    1 |-------x------------
    2 |-----------------x--
    3 |-----------------x--
    4 |-----------------x--
    5 |-------x------------
    6 |--------------------


Actual Final Output pattern:

1 |-------3------------------------8--------10------12
2 |-------3---------5--------------8------------------
3 |-----------------5---------7---------9-----------12
4 |--2--------------5-----------------------10------12
5 |-------3---------5---------7-------------10--------
6 |-------3------------------------8--------10------12

So, if Pattern A exists within final output, I should only print position of pattern A in the output and x should be replaced by the fret position numbers as found in the actual output.

所需的输出如下所示:

    1 |-------3------------
    2 |-----------------5--
    3 |-----------------5--
    4 |-----------------5--
    5 |-------3------------
    6 |--------------------

注意:这里的一个位置是 5 个字符。即“--x--”是一个位置

【问题讨论】:

  • 我不明白为什么我的问题被否决了。这不是一个有效的问题还是没有遵循某些协议?
  • 我可以看到几种可能性:(1)“有什么办法……?”是一个格式错误的问题的强烈指示。你在一台通用计算机上,它只是缺少一台车床。由于基本信息显然在您的数据中,因此答案是“是”。对于大多数问题,“我该怎么做”是题外话。 (2) 缺乏努力。您的描述强烈暗示了一个查找表,但您还没有尝试实现它。 (3) 过于冗长的描述。请记住本网站的中心目的。 (4)缺乏研究。记忆是一种众所周知的技术。
  • 这看起来很像吉他指法谱。你的模式真的是一个随着时间推移演奏的品丝列表,叠加在线条上吗?
  • @chepner 是的,我正在尝试打印吉他谱表并识别和弦形状^_^ 最后,知道我在做什么的人。我将音阶上的所有音符都印在 22 品的琴颈上,但不知道如何根据需要根据左手形状过滤掉音符。
  • @Prune 谢谢。我是初学者,自学成才,非研究生,我不知道查找表是否存在。我知道记忆,但我无法在这里成功实现它。这个问题有点冗长,是的,因为我正在尽力在这里解释这个问题。这绝对不是我没有尝试解决自己或做一些研究的事情。我问因为我无法在其他任何地方得到解释。不是因为我懒得自己尝试解决问题。在构建问题的所有努力之后,当问题被否决并关闭时,非常令人沮丧。

标签: python python-3.x memoization


【解决方案1】:

这是一个适合你的代码。

xString = '''--x---------x---------x----x---------x---------x----x---------x---------x---------x----x---------x----x----x--
--x---------x---------x----x---------x---------x----x---------x---------x---------x----x---------x----x----x--
--x---------x----x---------x---------x---------x----x---------x---------x---------x----x---------x----x----x--
--x----x----x---------x---------x----x---------x---------x----x----x---------x----x----x---------x------------
--x---------x---------x---------x----x---------x---------x----x---------x---------x----x----x---------x-------
--x---------x---------x----x---------x---------x---------x----x---------x---------x----x---------x----x-------
--x---------x---------x----x---------x---------x----x---------x---------x---------x----x---------x----x----x--'''    
print(xString)
print('The pattern for this are :')

for x in xString.split('\n'):
    for i in range(0,len(x),5):
        if x[i:i+5] == '-----':
            print ('-----',end='')
        else:
            a = i//5
            if a > 9: print (f'--{a}-',end='')
            else: print (f'--{a}--',end='')
    print ()

这段代码的输出将是:

--x---------x---------x----x---------x---------x----x---------x---------x---------x----x---------x----x----x--
--x---------x---------x----x---------x---------x----x---------x---------x---------x----x---------x----x----x--
--x---------x----x---------x---------x---------x----x---------x---------x---------x----x---------x----x----x--
--x----x----x---------x---------x----x---------x---------x----x----x---------x----x----x---------x------------
--x---------x---------x---------x----x---------x---------x----x---------x---------x----x----x---------x-------
--x---------x---------x----x---------x---------x---------x----x---------x---------x----x---------x----x-------
--x---------x---------x----x---------x---------x----x---------x---------x---------x----x---------x----x----x--
The pattern for this are :
--0---------2---------4----5---------7---------9----10--------12--------14--------16---17--------19---20---21-
--0---------2---------4----5---------7---------9----10--------12--------14--------16---17--------19---20---21-
--0---------2----3---------5---------7---------9----10--------12--------14--------16---17--------19---20---21-
--0----1----2---------4---------6----7---------9---------11---12---13--------15---16---17--------19-----------
--0---------2---------4---------6----7---------9---------11---12--------14--------16---17---18--------20------
--0---------2---------4----5---------7---------9---------11---12--------14--------16---17--------19---20------
--0---------2---------4----5---------7---------9----10--------12--------14--------16---17--------19---20---21-

【讨论】:

  • 谢谢乔,将用它来清理我的代码并使其更紧凑。
【解决方案2】:

如果我理解了这个问题的症结所在,您的输入将是一个标有停止位置的指板(用数字握住琴弦的位置)。您想识别此板中存储的和弦。

您的注意力集中在错误的领域。为什么要识别输出形式?为了人类方便,这是一堆字符。为了使它成为一个合理的应用程序,您必须抽象出每个和弦的特性,并以一种更容易匹配到类似抽象的指板的方式存储 那个

正如您所说,任何匹配的参数都是起始音品:您需要将和弦“变调”多远才能获得匹配。把它想象成笛卡尔平面上的一个格子。 (0,0) 是您的“变调夹”音品,位于图左上角的假想弦 0 上(在弦 1 上方,高音 E)上的“顶部”。现在,您的示例和弦 Amaj 锚定在高 E 第一品格处,由 (fret, string) 对的五个格点表示:

[ (0, 1),
  (2, 2),
  (2, 3),
  (2, 4),
  (0, 5) ]

现在,将这个翻译成任何音品f

[ (f+0, 1),
  (f+2, 2),
  (f+2, 3),
  (f+2, 4),
  (f+0, 5) ]

...那个是你想要找到的模式,for f in range(12),也许。

保留这些音点模式的列表,可能是带有和弦标签的字典。

  • 编写一个输入函数,将 6 行指板简化为点矩阵。
  • 编写一个输出函数以将结果呈现为所需的 6 行形式,如 3+5 Amaj 示例中所示。
  • 编写一个匹配函数来遍历存储的和弦。对于每个和弦,将其从 0 品滑到您的实际极限,寻找所有点都与输入板匹配的实例。

【讨论】:

  • 这是我得到的关于这个问题的最有用的回答!太感谢了。我确实认为除了试图理解我得到的输出之外,必须有更好的方法来做到这一点。喜欢你理解我试图用“变调夹”这个和弦的东西来理解的事实。
【解决方案3】:

是的。这称为“记忆”。您维护输入参数(键)和输出(值)的持久字典。每次调用该函数时,您首先检查该参数系列之前是否曾出现过。

您可以查找@memoize 装饰器,也可以查找与“动态编程”结合使用的术语。

【讨论】:

  • 感谢您的回复。我之前在递归调用中使用过记忆。我相信这个答案非常接近我的需要。问题是,实际代码在这里解释起来要复杂得多。我将进一步编辑我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
相关资源
最近更新 更多