代码在两个列表中都添加了一个术语,没有明显的原因

2024-10-02 08:30:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一些代码来打印一些东西,但它一直在打印其他东西。下面是代码,它打印的内容,以及我希望它打印的内容。在

def speech2text(phonemes, bigrams, trigrams, alpha, topn=10):
    phoneme_list = phonemes.split()
    beam2 = [[['^'],1.0]]
    i = 0
    for phoneme in phoneme_list:
        beam = beam2*len(bigrams[phoneme])
        for value in bigrams[phoneme]:
            beam[i][0].append(value)
            if i == len(beam)-1:
                i = 0
            else:
                i += 1
            print(beam)





from collections import defaultdict
bigrams = defaultdict(dict, {'AH': {'u': 0.4, 'l': 0.2, 'ous': 0.2, 'e':       0.2}, 'IH': {'y': 0.16666666666666666, 'i': 0.6666666666666666, 'e': 0.16666666666666666}, 'AE': {'a': 1.0}, 'K': {'c': 0.4, 'x': 0.2, 'q': 0.2, 'ch': 0.2}, 'H': {}, 'G': {'g': 1.0}, 'SH': {'sh': 1.0}, 'Z': {'se': 1.0}, 'AA': {'o': 1.0}, 'JH': {'ge': 1.0}, 'W': {'u': 0.5, 'w': 0.5}, 'V': {'v': 1.0}, 'M': {'me': 0.2, 'm': 0.8}, 'N': {'ne': 0.2, 'n': 0.8}, 'F': {'f': 1.0}, 'B': {'b': 1.0}, 'D': {'de': 0.16666666666666666, 'dd': 0.16666666666666666, 'd': 0.6666666666666666}, 'OW': {'o': 1.0}, 'L': {'l': 0.8333333333333334, 'e': 0.16666666666666666}, 'T': {'te': 0.16666666666666666, 'tt': 0.08333333333333333, 't': 0.75}, 'EH': {'ea': 0.3333333333333333, 'a': 0.3333333333333333, 'e': 0.3333333333333333}, 'S': {'ss': 0.125, '_': 0.25, 's': 0.625}, 'R': {'re': 0.16666666666666666, 'r': 0.8333333333333334}, 'ER': {'or': 0.25, 'er': 0.75}, 'EY': {'ai': 0.2, 'a': 0.8}, 'P': {'p': 1.0}, 'IY': {'y': 0.5, 'e': 0.5}, 'AY': {'i': 1.0}}) 
trigrams = defaultdict(dict, {('T', 'u'): {'tt': 1.0}, ('S', '^'): {'s': 1.0}, ('D', '^'): {'d': 1.0}, ('K', 'e'): {'x': 1.0}, ('M', '^'): {'m': 1.0}, ('T', 'a'): {'te': 1.0}, ('S', 'x'): {'_': 1.0}, ('T', 'o'): {'t': 1.0}, ('T', 's'): {'t': 1.0}, ('AA', 'm'): {'o': 1.0}, ('IH', '^'): {'i': 0.6666666666666666, 'e': 0.3333333333333333}, ('D', 'n'): {'d': 1.0}, ('B', 'o'): {'b': 1.0}, ('IY', 'f'): {'e': 1.0}, ('K', 'i'): {'c': 1.0}, ('K', '^'): {'c': 0.3333333333333333, 'ch': 0.3333333333333333, 'q': 0.3333333333333333}, ('IH', 't'): {'i': 1.0}, ('S', 'or'): {'s': 1.0}, ('R', 'ch'): {'r': 1.0}, ('D', 'l'): {'d': 1.0}, ('IY', 'r'): {'y': 0.5, 'e': 0.5}, ('IH', 'm'): {'y': 1.0}, ('L', 'c'): {'l': 1.0}, ('EH', 'd'): {'a': 0.5, 'e': 0.5}, ('G', 'o'): {'g': 1.0}, ('V', 'n'): {'v': 1.0}, ('AE', 's'): {'a': 1.0}, ('S', 'y'): {'s': 1.0}, ('OW', 'r'): {'o': 1.0}, ('L', 'e'): {'l': 1.0}, ('N', 'i'): {'ne': 0.3333333333333333, 'n': 0.6666666666666666}, ('OW', 'l'): {'o': 1.0}, ('Z', 'n'): {'se': 1.0}, ('ER', 'm'): {'er': 1.0}, ('P', '^'): {'p': 1.0}, ('IH', 'u'): {'i': 1.0}, ('R', 'a'): {'re': 1.0}, ('R', '^'): {'r': 1.0}, ('T', 'e'): {'t': 1.0}, ('L', 'l'): {'e': 1.0}, ('EY', 't'): {'ai': 0.5, 'a': 0.5}, ('AY', 'l'): {'i': 1.0}, ('EY', 'b'): {'a': 1.0}, ('IY', 't'): {'y': 1.0}, ('ER', 'n'): {'er': 1.0}, ('OW', '^'): {'o': 1.0}, ('M', 'o'): {'me': 1.0}, ('S', 'u'): {'s': 1.0}, ('OW', 'g'): {'o': 1.0}, ('W', 'q'): {'u': 1.0}, ('T', '^'): {'t': 1.0}, ('S', 'ous'): {'_': 1.0}, ('AH', 'b'): {'u': 1.0}, ('EH', 'l'): {'ea': 1.0}, ('OW', 'm'): {'o': 1.0}, ('M', 'e'): {'m': 1.0}, ('EY', 'v'): {'a': 1.0}, ('EY', 'p'): {'a': 1.0}, ('AH', 'er'): {'ous': 1.0}, ('JH', 'er'): {'ge': 1.0}, ('ER', 'tt'): {'er': 1.0}, ('R', 't'): {'r': 1.0}, ('L', '^'): {'l': 1.0}, ('B', 'e'): {'b': 1.0}, ('SH', '^'): {'sh': 1.0}, ('ER', 'w'): {'or': 1.0}, ('W', '^'): {'w': 1.0}, ('T', 'i'): {'t': 1.0}, ('L', 'o'): {'l': 1.0}, ('B', '^'): {'b': 1.0}, ('F', '^'): {'f': 1.0}, ('AH', 'r'): {'u': 1.0}, ('L', 'ai'): {'l': 1.0}, ('N', 'ea'): {'n': 1.0}, ('AH', 'dd'): {'l': 1.0}, ('S', 'a'): {'ss': 0.5, 's': 0.5}, ('AH', 'd'): {'e': 1.0}, ('N', 'o'): {'n': 1.0}, ('AE', 'b'): {'a': 1.0}, ('AA', 'sh'): {'o': 1.0}, ('D', 'a'): {'de': 0.5, 'dd': 0.5}})
speech2text("M IH T", bigrams, trigrams, alpha=0.5)

这是它打印的

^{pr2}$

这是我想要打印的

[[['^', 'm'], 1.0], [['^', 'me'], 1.0]]
...... and so on

基本上,为什么要在两个列表上都加上这个词?我认为这与beam和beam2“指向”同一个列表有关,我尝试使beam2=beam2*len(bigrams[phoneme]),然后beam=list(beam2),我相信这会使它们指向内存中的两个单独的列表,但可能不是吗?在

谢谢你的帮助

编辑:

所以在Gassa的帮助下,我的代码现在看起来像这样,但是我有一个新的问题:

def speech2text(phonemes, bigrams, trigrams, alpha, topn=10):
phoneme_list = phonemes.split()
beam2 = [[['^'],1.0]]
i = 0
for phoneme in phoneme_list:
    beam = [[[['^'],1.0]] for k in range (len(bigrams[phoneme]))]
    for value in bigrams[phoneme]:
        beam[i][0].append(value)
        if i == len(beam)-1:
            i = 0
        else:
            i += 1
    beam2 = beam
    print(beam2)

这里它打印的是beam2,包含两组,然后三组,然后三组,当我真正需要它包含两组,六组,然后18组。可以使用此代码:

def speech2text(phonemes, bigrams, trigrams, alpha, topn=10):
phoneme_list = phonemes.split()
beam2 = [[['^'],1.0]]
i = 0
for phoneme in phoneme_list:
    beam = [beam2 for k in range (len(bigrams[phoneme]))]
    for value in bigrams[phoneme]:
        beam[i][0].append(value)
        if i == len(beam)-1:
            i = 0
        else:
            i += 1
    beam2 = beam
    print(beam2)

但当然,我们又回到了最初的问题。在

再次感谢您的帮助!在


Tags: inforlenvaluelistbeamertrigrams
1条回答
网友
1楼 · 发布于 2024-10-02 08:30:53

线

beam = beam2*len(bigrams[phoneme])

将列表梁创建为len(bigrams[phoneme])引用到同一个列表beam2[0]。在

你可以改为使用一行

^{pr2}$

请注意,beam2不再使用。 这样就可以得到输出

^{3}$

这并不是您想要的,但至少现在{}的内容是不同的列表。在


编辑: 至于问题的第二部分,这段代码似乎可以满足您的需要:

def speech2text(phonemes, bigrams, trigrams, alpha, topn=10):
    phoneme_list = phonemes.split()
    beam2 = [[['^'],1.0]]
    i = 0
    for phoneme in phoneme_list:
        beam = [copy.deepcopy (j) for j in beam2 for k in range (len(bigrams[phoneme]))]
        for j in range (len (beam2)):
            for value in bigrams[phoneme]:
                beam[i][0].append(value)
                if i == len(beam)-1:
                    i = 0
                else:
                    i += 1
        beam2 = beam
        print(beam2)
  1. 在复制.deepcopypart确保列表中的所有列表都被正确地复制,并且您不必自己处理复制。

  2. for j in beam2 for k in range部分是将所有内容放入同一个列表中,而不是作为列表列表。

  3. 新的for j in range (len (beam2)):部分是将您的更改应用于整个梁,而不仅仅应用于其前缀。

相关问题 更多 >

    热门问题