python - 在字典中使用列表作为 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]
然后我创建了一个新的空字典,名为ngrams
I 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
解决方案
推荐阅读
- postgresql - 是否可以在 Timescale 中为一个视图设置多个刷新连续聚合策略?
- git - 如何 git clone --bare 只有一个分支并轻松更新
- python - 仅在使用 for 循环时使用 BeautifulSoup 抓取问题
- mysql - 为什么以下 MySQL 查询会生成错误?
- parsing - Peg 解析器 - 支持转义字符
- python - 函数未在 cog discord.py 中定义
- indexing - IndexError:索引 518 超出轴 0 的范围,大小为 518 站点:stackoverflow.com
- python - 检查变量列并从匹配行中的另一列获取值
- swift - 如何在 SwiftUI 中使用可观察对象并与 NavigationLink 绑定?
- typescript - 如何正确声明此通用对象类型映射?