【问题标题】:Searching for hidden key-value pairs in dictionary在字典中搜索隐藏的键值对
【发布时间】:2016-09-21 00:05:11
【问题描述】:

我需要从字典中提取非常具体的键值对。键是整数,并且值对于一定数量的键重复,这会有所不同。 我必须提取重复值的最后一个键值对。所以,在这种情况下,我需要提取键值对:

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 ']
}

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

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布代码并准确描述问题之前,我们无法有效地帮助您。 StackOverflow 不是编码或教程服务。
  • 也就是说,你的问题是什么?看来您需要在音符更改之前获取每个组的最后一个值。为此使用字典很奇怪。时间序列通常是一个序列(值的有序序列、元组或列表)。
  • 你是对的:我需要在注释更改之前获取每个组的最后一个值。所以,你是说我应该把我的字典变成一个列表来解决这个问题?
  • prune 是正确的,dict 是一个糟糕的结构,dicts 是无序的,因此没有基于密钥编号的先或后的概念

标签: python dictionary iterator keyvaluepair


【解决方案1】:

这可能对你有用:

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)

【讨论】:

  • 天哪,你们速度太快了……稍微解释一下可能会更好。
  • 很难知道要解释什么部分,因为您的原始帖子中没有任何具体问题。对于您在 Stack Overflow 上的下一篇文章,请包括一个特定的问题,以及您为自己解决问题而编写的一些代码。这样做会鼓励人们用解释来回应,而不仅仅是代码示例。请在下一篇文章之前查看How to Ask
【解决方案2】:

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

不管怎样,你或许可以使用标准库的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 '}

附:有一些不错的库可用于处理音符和乐谱,例如,您可以查看 mingusabjad

【讨论】:

  • 我正在使用 librosa 制作色谱图,并使用 LilyPond 雕刻机绘制音符。
  • @Capriles 听起来很棒!顺便说一句,mingus 和 abjad 都支持 LilyPond 后端进行乐谱渲染。
【解决方案3】:

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

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])

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2018-05-19
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多