在字典中搜索隐藏的键值对

时间:2016-05-23 23:52:54

标签: python dictionary iterator keyvaluepair

我需要从字典中提取非常具体的键值对。键是整数,值对于一定数量的键重复,这些键是变化的。 我必须为重复值提取最后一个键值对。因此,在这种情况下,我需要提取键值对:

42: ['e ']
85: ['dis ']
88: ['d ']
95: ['e ']

某个值出现的次数是随机的。稍后可能会再次出现一个值,就像当前的值['e']一样,因此我需要将其提取两次。

这是我在这里使用的例子,用于我正在处理的dictonary类型:

notes_dict = {
    0: ['e '], 
    1: ['e '], 
    2: ['e '], 
    3: ['e '], 
    #(...)
    40: ['e '], 
    41: ['e '], 
    42: ['e '], 
    43: ['dis '], 
    44: ['dis '], 
    45: ['dis '],
    #(...)
    83: ['dis '], 
    84: ['dis '], 
    85: ['dis '], 
    86: ['d '], 
    87: ['d '], 
    88: ['d '], 
    89: ['e '], 
    90: ['e '], 
    91: ['e '], 
    92: ['e '], 
    93: ['e '], 
    94: ['e '], 
    95: ['e ']
}

背后的理念:这本词典包含有关在给定时间播放哪种音符的信息。我需要自动完成这个过程,以便尝试绘制非常简化的乐谱。

3 个答案:

答案 0 :(得分:2)

这可能对您有用:

from itertools import groupby
notes_dict = {
    0: ['e '],
    1: ['e '],
    2: ['e '],
    3: ['e '],
    40: ['e '],
    41: ['e '],
    42: ['e '],
    43: ['dis '],
    44: ['dis '],
    45: ['dis '],
    83: ['dis '],
    84: ['dis '],
    85: ['dis '],
    86: ['d '],
    87: ['d '],
    88: ['d '],
    89: ['e '],
    90: ['e '],
    91: ['e '],
    92: ['e '],
    93: ['e '],
    94: ['e '],
    95: ['e ']
}

for k, g in groupby(sorted(notes_dict),
                    key=notes_dict.get):
    print '{}: {}'.format(list(g)[-1], k)

答案 1 :(得分:0)

有一个dict来表示这些可能是一个坏主意,因为字典不是按键在内部排序的。你可能最好有一个元组列表或东西。也许甚至是大熊猫系列。

无论如何,你可以使用标准库的itertools来做你想做的事:

>>> import itertools
>>> notes = sorted((k, v[0]) for k, v in notes_dict.items())
>>> dict(list(g)[-1] for _, g in itertools.groupby(notes, lambda x: x[1]))
{42: 'e ', 85: 'dis ', 88: 'd ', 95: 'e '}

P.S。有一些很好的库可用于处理音符和乐谱,例如,您可以查看mingusabjad

答案 2 :(得分:0)

是的,我认为你应该把它变成一个字符串列表:

pitch = ['e', 'e', ..., 'dis', ..., 'd', ..., 'e', ... 'e', 'dummy']

现在,输出更像是

print_list = [(i, pitch[i]) for i in range(len(pitch)) if pitch[i] != pitch[i+1])

但是,如果这是您需要制作字典的唯一用途,那么我建议您使用当前格式的早期答案。