在字典中搜索隐藏的键值对
Searching for hidden key-value pairs in dictionary
我需要从字典中提取非常具体的键值对。键是整数,值对于一定数量的键重复,这会有所不同。
我必须提取重复值的最后一个键值对。所以,在这种情况下,我需要提取键值对:
42: ['e ']
85: ['dis ']
88: ['d ']
95: ['e ']
某个值出现的次数是随机的。稍后可能会再次出现一个值,如本例中的值 ['e '],因此我需要将其提取两次。
这是我在这里使用的示例,用于处理我正在处理的词典类型:
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 ']
}
这背后的想法:这本词典包含有关在给定时间正在播放哪个音符的信息。我需要让这个过程自动进行,以便尝试绘制非常简化的 sheet 音乐。
这可能对你有用:
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)
用字典来表示这些可能不是一个好主意,因为字典在内部不是按键排序的。你可能最好有一个元组列表或其他东西。甚至可能是 pandas 系列。
无论如何,你可以使用标准库的 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 '}
是的,我认为你应该把它变成一个字符串列表:
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])
但是,如果这是您需要使用字典的唯一用途,那么我建议使用适用于您当前格式的早期答案。
我需要从字典中提取非常具体的键值对。键是整数,值对于一定数量的键重复,这会有所不同。 我必须提取重复值的最后一个键值对。所以,在这种情况下,我需要提取键值对:
42: ['e ']
85: ['dis ']
88: ['d ']
95: ['e ']
某个值出现的次数是随机的。稍后可能会再次出现一个值,如本例中的值 ['e '],因此我需要将其提取两次。
这是我在这里使用的示例,用于处理我正在处理的词典类型:
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 ']
}
这背后的想法:这本词典包含有关在给定时间正在播放哪个音符的信息。我需要让这个过程自动进行,以便尝试绘制非常简化的 sheet 音乐。
这可能对你有用:
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)
用字典来表示这些可能不是一个好主意,因为字典在内部不是按键排序的。你可能最好有一个元组列表或其他东西。甚至可能是 pandas 系列。
无论如何,你可以使用标准库的 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 '}
是的,我认为你应该把它变成一个字符串列表:
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])
但是,如果这是您需要使用字典的唯一用途,那么我建议使用适用于您当前格式的早期答案。