2016-03-27 6 views
0
dictionary[pattern_key] = {"key": index_key, "document": index_source, "startPos":index_start, "endPos": index_end} 

Это отрывок из моего списка словарейКак отсортировать список словарей по значению

{ 
'AGACAATCTC': {'startPos': '174', 'document': 'source-document01012.txt', 'endPos': '183', 'key': 'AGACAATCTC'}, 
'GGTCAGACAA': {'startPos': '18', 'document': 'source-document01012.txt', 'endPos': '27', 'key': 'GGTCAGACAA'}, 
'TAGATGAAGT': {'startPos': '102', 'document': 'source-document01012.txt', 'endPos': '111', 'key': 'TAGATGAAGT'} 
} 

Как я вроде что документа, а затем StartPos?

я пытался что-то подобное, но не работает

sorted_dict = sorted(dictionary, key=itemgetter(pattern_key[document]))

script.py

#!/usr/bin/env python 
import sys 

dictionary = {}; 

for pattern in sys.stdin: 

    if "," in pattern: 
     pattern_key, pattern_source, pattern_start, pattern_end = pattern.strip().split(",") 
     index_file = open('index.txt', 'r') 

     for line in index_file: 
      if "," in line: 
       index_key, index_source, index_start, index_end = line.strip().split(",") 
       if pattern_key == index_key: 
        dictionary[pattern_key] = {"document": index_source, "startPos":index_start, "endPos": index_end} 

sorted(dictionary.items(), key = lambda x: (x[1]['document'], int(x[1]['startPos']))) 

for k, v in dictionary.items(): 
    print (k, '-->', v) 
+0

Для вывода вы хотите, чтобы все значения диктата или только ключевые слова? ['AGACAATCTC', 'TAGATGAAGT'] вот так? – akash12300

+0

Мне нужен весь вывод, отсортированный по документу, а затем startPos ... –

+0

Сортировка НЕ ​​обновляет словарь для сортировки значений. Вам нужно использовать список (, ) кортежа, возвращенный командой sorted(). Если вы конвертируете список кортежей в словарь и затем используете его, он может снова нарушить отсортированный порядок. – akash12300

ответ

3

Вы можете получить записи во внутреннем словаре как ключи для sorted:

sorted(dictionary.items(), key = lambda x: (x[1]['document'], int(x[1]['startPos']))) 

Ключ кортежа будет отсортирован первым 0-й элемент, затем 1-й и т. Д.

Обратите внимание, что это создает список кортежей, где каждый кортеж равен (str, dict).

EDIT:
В вашем контексте, правильная реализация заключается в следующем:

sorted_values = sorted(dictionary.items(), key = lambda x: (x[1]['document'], int(x[1]['startPos']))) 

for k, v in sorted_values: 
    print (k, '-->', v) 
+0

hmm спасибо, но он не сортируется по startPos .. –

+0

Выполнение этого на ваших данных образца возвращает: '('GGTCAGACAA', {'document': 'source-document01012.txt', 'endPos': '27', ' startPos ':' 18 ',' key ':' GGTCAGACAA '}) (' TAGATGAAGT ', {' document ':' source-document01012.txt ',' endPos ':' 111 ',' startPos ':' 102 ' , 'key': 'TAGATGAAGT'}) ('AGACAATCTC', {'document': 'source-document01012.txt', 'endPos': '183', 'startPos': '174', 'key': ' AGACAATCTC '}) '. Это отсортировано по 'document' и' startPos'. – sdsmith

+0

Можете ли вы привести пример, для какого значения он не сортировал использование «startPos»? Потому что я пробовал аналогичный подход, и это сработало для меня. – akash12300

2

сделать ваши сортировки на основе ваших желаемых критериев затем создать новый OrderedDict из отсортированного списка, так как dict не может держать сортировку по своей природе:

>>> from collections import OrderedDict 
>>> 
>>> d = {'AGACAATCTC': {'endPos': '183', 'document': 'source-document01010.txt', 'key': 'AGACAATCTC', 'startPos': '174'}, 'GGTCAGACAA': {'endPos': '27', 'document': 'source-document01010.txt', 'key': 'GGTCAGACAA', 'startPos': '18'}, 'TAGATGAAGT': {'endPos': '111', 'document': 'source-document01011.txt', 'key': 'TAGATGAAGT', 'startPos': '102'}} 
>>> 
>>> d_ordered = OrderedDict(sorted(d.items(), key=lambda t:(t[1]['document'], int(t[1]['startPos'])))) 
>>> 
>>> d_ordered 
OrderedDict([('GGTCAGACAA', {'endPos': '27', 'document': 'source-document01010.txt', 'key': 'GGTCAGACAA', 'startPos': '18'}), ('AGACAATCTC', {'endPos': '183', 'document': 'source-document01010.txt', 'key': 'AGACAATCTC', 'startPos': '174'}), ('TAGATGAAGT', {'endPos': '111', 'document': 'source-document01011.txt', 'key': 'TAGATGAAGT', 'startPos': '102'})]) 
Смежные вопросы