python 可以在函数中打印多行时识别打印语句中的模式吗?

Can python recognise patterns in the printed statements while printing more than one line in a function?

我有一个函数可以一行一行地打印一堆行。它接受不同符号的输入,然后根据 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)

我得到以下输出:

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

My question is this: How can I can have a python program recognise what output patters were generated and take action accordingly?

我正在寻找的是这样的东西:

这是我的实际代码输出:

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--”是一个位置

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

你可以查查@memoize装饰器,也可以查查与“动态规划”相关的术语。

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

您关注的领域不对。为什么要识别输出形式?这是一堆方便人类使用的字符。为了使其成为一个合理的应用程序,您必须抽象每个和弦的特性,并以更容易与类似抽象的指板相匹配的方式存储 that

如您所说,任何匹配的参数都是起始音品:您需要将和弦“变调夹”多远才能匹配。将其视为笛卡尔平面上的格子。 (0,0) 是您的“变调夹”品格,刚好位于“顶部”,位于图表左上角的虚弦 0(弦 1 上方,高音 E)上。现在,您的示例和弦 Amaj 锚定在高 E 第一品,由(品,弦)对的五个格点表示:

[ (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 品滑动到您的实际极限,寻找所有点都与输入板匹配的实例。

这是适合您的代码。

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-