gpt4 book ai didi

python - 如何从具有元组集和列表的现有字典创建嵌套字典

转载 作者:行者123 更新时间:2023-12-03 17:24:47 26 4
gpt4 key购买 nike

我已经解析了一个 midi 文件,并且我已经成功地得到了一个按乐器分解的音符字典。一个简短的例子是 note_dict下面,为了这个问题的目的而被截断。
我的最终目标是拥有一个嵌套字典,为我提供轨道名称,然后将每个可能的音符作为键,然后将所有可能的“下一个”音符列表作为值。目的是将其用作 Markov chain in Foxdot ,一个用于音乐生成的python接口(interface)。
它应该看起来像:

{'track1': {note: [note1, note2, note3], note2: [note1, note2, note3]}, 'track2': {note: [note1, note2, note3], note2: [note1, note2, note3]}
这是我所拥有的一个例子:
import itertools 

def pairwise(iterable):
a, b = itertools.tee(iterable)
next(b, None)
return list(zip(a, b))

note_dict = {'Vocal': [-2, -2, -1, -2], 'Guitar': [1, 1, 4, 1, -2, 1]}

note_dict_updated = { track: [{ n for n in notes }, pairwise(notes), notes] for track, notes in note_dict.items() }
print(note_dict_updated)
这给了我以下内容,其中第一组是所有不同的音符,元组列表是 (note, next note) 的配对,最后一个列表只是按顺序排列的原始笔记列表。
{'Vocal': [{-2, -1}, [(-2, -2), (-2, -1), (-1, -2)], [-2, -2, -1, -2]], 'Guitar': [{1, 4, -2}, [(1, 1), (1, 4), (4, 1), (1, -2), (-2, 1)], [1, 1, 4, 1, -2, 1]]}
我希望集合的元素充当键,并且当元组的第一个元素与集合的元素匹配时,它被添加到与键关联的值列表中。
我想要的最终结果,基于 note_dict以上是:
{'Vocal': {-2: [-2, -1], -1: [-2]}, 'Guitar': {1: [1, 4, -2], 4: [1], -2: [1]}}
尽管如此,我并没有被锁定在我需要使用 note_dict_updated 的方法中。 .如果有更聪明的方法可以从 note_dict 获取达到我想要的最终结果,我很想听听。
编辑:我已经更新了我的问题。 first answer为我的初始示例工作,但我相信当每个值中的注释列表重叠时会出现问题。希望我更新后的预期最终结果会更有帮助。

最佳答案

第一个循环创建具有内部键和相同唯一集的字典的中间字典。然后使用第二个 for 循环对其进行清理,如下所示:
输入:

{'Vocal': [-2, -2, -1, -2], 'Guitar': [1, 1, 4, 1]}
输出:
{'Guitar': {1: [1, 4], 4: [1]}, 'Vocal': {-2: [-1, -2], -1: [-2]}}
代码:
#create a new dictionary of dictionary with inner keys and same unique sets

note_dict_updated={}
for key, value in note_dict.iteritems():
note_dict_updated[key]={}
for element in set(note_dict[key]):
note_dict_updated[key][element]=list(set(note_dict[key]))

# remove the values (of not interest) from list values of inner keys
for key, value in note_dict_updated.iteritems():
comb=[]
for lkey, lvalue in note_dict_updated[key].iteritems():
for val in lvalue:
if (val,lkey) in comb:
try:
note_dict_updated[key][lkey].remove(lkey)
except ValueError as e:
print ('Issue in key {} for subkey {}'.format(key,lkey))
for val in lvalue:
comb.append((lkey,val))

关于python - 如何从具有元组集和列表的现有字典创建嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62986747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com