首页 > 解决方案 > 在字典中使用列表作为 VALUE

问题描述

更新:我发现了我的问题

gram = notesNumbers[i:(i+1)];

当我打印gram时,它将它打印为一个只有 1 个值的数组。例如它会打印[55]. 稍后在我的代码中我引用了 gram,但是它使用整个数组而不是其中的一个值。为了使它工作,我必须做gram[0]但是一个更简单的方法是将上面的代码重写为:

gram = notesNumbers[i]

现在,当我打印gram它时,给我一个值 ex)55


在我的代码中

我知道人们也有类似的问题,但在我的上下文中我该如何解决这个问题!

我试图根据马尔可夫链做一些预测。

我有一个非常简单的程序。我已经使用图书馆 mido 来获取音乐笔记。我已经解析了它并将所有笔记放在一个名为的数组中notesNumbers

notesNumbers数组输出看起来像这样

[55、62、67、74、55、62、67、74、55、62、67、74、55、62、67、74、55、62、67、74、55、62、67、74、55 , 62, 67, 74, 55, 48, 52, 55, 59, 67, 71, 67, 71, 67, 71, 59, 67, 71]

然后我创建了一个新的空字典,名为ngramsI have set a beginning point for the markovchain as 88 note by the variablecurrentGram

然后我继续做的是创建马尔可夫转换“矩阵”。我使用我的字典创建一个带有数字的键,然后为该值创建一个数组,该数组包含给定中出现的每个可能的“下一个数字”notesNumber

如果我打印,我应该看到ngrams的是这样的(示例):{'88': ['45', '55', '67', '45', '45', '33', '77' , '90'], '32': ['44', '76', '77'}

但是,当尝试通过迭代添加到我的字典时,我得到了错误TypeError: unhashable type: 'list' python

我在包含的行中收到错误

if not gram in ngrams:

代码如下:

from midiutil.MidiFile import MIDIFile
import random
import mido
from mido import MidiFile
from mido import MidiTrack


#ignore midi stuff
mid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)

notesNumbers = []
#notesNumbers = notesNumbers2


ngrams= {}
#Parsing message to get the notes to be played
for msg in MidiFile('song.mid'):
    if (not msg.is_meta):
        if (msg.type == 'note_on'):
            notesNumbers.append(msg.note)



#print(notesNumbers)

#starting number I picked
currentGram = 88
#print notesNumbers


#myOtherString = "".join(str(elm) for elm in notesNumbers)
#print notesNumbers2
#currentGram = random.choice(myOtherString)


ngrams= {}
#print currentGram

print(len(notesNumbers))

#creating markov transition matrix without directly doing probabilty 
#Creating a dictionary, getting each number and the frequency of the following number 
for i in range(len(notesNumbers)):
    print("about to iterate")
    gram = notesNumbers[i:(i+1)];
    print(gram)
    print("finish iterate")
    lessthan = len(notesNumbers) - 1

    if not gram in ngrams:
        ngrams[gram] = []
    else:
        if (i < lessthan):
            nextgram = notesNumbers[i+1]

        ngrams[gram].append(nextgram)


print(ngrams)


result = []
result.append(currentGram)

#getting next state
for i in range(len(notesNumbers)):
    possibilites = ngrams[currentGram]

    #print possibilites

    nextChoice = random.choice(possibilites)
    #print nextChoice
    result.append(nextChoice)

    currentGram = nextChoice
print("Restult")
print result

标签: pythonmarkov-chains

解决方案


推荐阅读