2016-05-23 2 views
2

Мне нужно извлечь очень специфичные пары ключ-значение из словаря. Клавиши представляют собой целые числа, и значения повторяются для определенного количества ключей, которые различаются. Я должен извлечь последнюю пару ключ-значение для повторного значения. Таким образом, в данном случае, мне нужно, чтобы извлечь пары ключ-значение:Поиск скрытых пар ключ-значение в словаре

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

Идеей этого: этот словарь contais информации о которой музыкальная нота воспроизводимая в данный момент времени , Мне нужно сделать этот процесс автоматическим, чтобы попытаться построить очень упрощенную нотную музыку.

+0

Добро пожаловать в StackOverflow. Прочтите и следуйте инструкциям по отправке в справочной документации. [Минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve) применим здесь. Мы не можем эффективно помочь вам, пока вы не опубликуете свой код и не сможете точно описать проблему. StackOverflow не является кодовым или учебным сервисом. – Prune

+0

Что сказал, в чем ваш вопрос? Похоже, что вам нужно получить последнее значение каждой группы, как раз перед запиской. Использование словаря для этого является странным; временной ряд обычно представляет собой последовательность (упорядоченные ряды значений, кортеж или список). – Prune

+0

Вы правы: мне нужно получить последнее значение каждой группы, как раз перед запиской. Итак, вы говорите, что я должен превратить словарь в список, чтобы решить эту проблему? – Capriles

ответ

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) 
+0

Гоша, вы люди быстры ... Возможно, лучше с небольшим количеством объяснений. –

+0

Трудно понять, какую часть объяснять, учитывая, что у вашего оригинального сообщения нет конкретного вопроса. Для следующего сообщения в Stack Overflow, пожалуйста, укажите конкретный вопрос, а также некоторый код, который вы написали, чтобы решить проблему самостоятельно.Это позволит людям реагировать на объяснения, а не только на образцы кода. Пожалуйста, см. [Ask] перед следующим сообщением. –

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. есть несколько хороших библиотек для работы с нотами и нотами, вы можете посмотреть, например, mingus и abjad.

+0

Я использую librosa, чтобы сделать хромаграмму и гравер LilyPond для создания заметок. – Capriles

+0

@Capriles Звучит здорово! Кстати, и mingus, и abjad поддерживают поддержку LilyPond для рендеринга нотной музыки. – aldanor

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

Однако, если это единственное применение вам нужно чтобы сделать из вашего словаря, тогда я рекомендую более ранние ответы, которые работают с вашим текущим форматом.

Смежные вопросы