代码将术语附加到两个列表中,无明显原因

时间:2016-04-29 10:24:57

标签: python python-3.x

我正在尝试编写一些打印内容的代码,但它会继续打印其他内容。下面是代码,打印内容以及我想要打印的内容。

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)

这是打印的内容

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

这是我想要打印的内容

[[['^', '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)

但当然我们回到原来的问题。

再次感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

该行

beam = beam2*len(bigrams[phoneme])

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

您可以改为使用像

这样的行
beam = [[['^'],1.0] for k in range (len(bigrams[phoneme]))]

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

[[['^', 'me'], 1.0], [['^'], 1.0]]
[[['^', 'me'], 1.0], [['^', 'm'], 1.0]]
...

这不完全是您想要的,但至少beam的内容现在是不同的列表。

编辑: 至于问题的第二部分,这段代码似乎可以做你想要的:

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. copy.deepcopy部分确保列表中的所有列表都被正确复制,您不必自己处理复制。

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

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