2014-10-13 2 views
1

Я изучал онлайн для простого способа создания упорядоченного словаря и приземлился на OrderedDict и его методе обновления, я успешно реализовал этот раз, но теперь код не стремится сортировать по добавлены термины, например, элементы размещаемые являются:Упорядоченный словарь не сортируется

 Doc1: Alpha, zebra, top 
     Doc2: Andres, tell, exta 
     Output: Alpha, top, zebra, Andres, exta, tell 
     My goal is to have Alpha, Andres......, top, zebra 

Это код:

finalindex= collections.OrderedDict() 
    ctr=0 
    while ctr < docCtr: 
     filename = 'dictemp%d.csv' % (ctr,) 
     ctr+=1 
     dicTempList = io.openTempDic(filename) 
     print filename 
     for key in dicTempList: 
      if key in finalindex: 
       print key 
       for k, v in finalindex.items(): 
       newvalue = v + "," + dicTempList.get(key) 
       finalindex.update([(key, newvalue)]) 
      else: 
       finalindex.update([(key, dicTempList.get(key))]) 
    io.saveTempDic(filename,finalindex) 

Может кто-то пожалуйста, помогите мне?

+3

'OrderedDict' не является«отсортированный»Словаре , Он возвращает ключи в порядке ввода, а не в лексикографическом порядке. Вам нужно что-то вроде [этого рецепта] (http://code.activestate.com/recipes/576998-sorted-dictionary/). – georg

+0

спасибо за быстрый ответ – KSM

+0

Вы можете отсортировать с помощью заказанного dict, см. Мой ответ. –

ответ

4

OrderedDicts запомнить порядок их создания. Если вы хотите его отсортировать, вам нужно сделать это, когда вы их создадите.Вот как отсортировать OrderedDict, an example taken from the docs:

from collections import OrderedDict 

d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} 
sorted_dict = OrderedDict(sorted(d.items(), key=lambda t: t[0])) 

Это будет работать с другим упорядоченным Dict, и я предпочитаю, чтобы импортировать модуль и справочные функции и классы от него для ясности для читателя, так это делается в немного другой стиль, но опять же, чтобы он отсортирован, вам нужно сортировать его перед созданием нового OrderedDict:

import collections 
ordered_dict=collections.OrderedDict() 
ordered_dict['foo'] = 1 
ordered_dict['bar'] = 2 
ordered_dict['baz'] = 3 
sorted_dict = collections.OrderedDict(sorted(ordered_dict.items(), 
              key=lambda t: t[0])) 

и sorted_dict возвращается:

OrderedDict([('bar', 2), ('baz', 3), ('foo', 1)]) 

Если лямбды запутаны, вы можете использовать operator.itemgetter

import operator 
get_first = operator.itemgetter(0) 
sorted_dict = collections.OrderedDict(sorted(ordered_dict.items(), 
              key=get_first)) 

Я использую ключевые аргументы, чтобы продемонстрировать их использование в случае, если вы хотите отсортировать по значениям, но Python сортирует кортежи (то, что dict.items() обеспечивает перебрать с помощью из list в Python 2 и итератора в Python 3) первого элемента затем второй и так далее, так что вы можете сделать это и получить тот же результат:

sorted_dict = collections.OrderedDict(sorted(ordered_dict.items())) 
+0

, вы забыли важную часть ответа, OrderedDict не отсортирован, он сохраняет только порядок, в котором находятся элементы добавлено –

+0

На самом деле вам вообще не нужен 'key ='. «get_first» - это то, что 'sort' делает по умолчанию. – georg

+0

@georg это хороший момент, я расскажу об этом и как использовать. –

2

Закаленный словарь не является сортированным словарем.

Из документации 8.3. collections — High-performance container datatypes:

OrderedDict Dict подкласс, который запоминает порядок записи были добавлены

(курсив мой)

Упорядоченный словарь хэш-таблица поддерживается структура который также поддерживает связанный список вдоль стороны, в котором хранится порядок вставки элементов. Словарь, когда он повторяется, использует этот связанный список.

Этот тип структуры очень полезен для кешей LRU, где требуется только поддерживать N самых последних запрошенных предметов, а затем выселять самый старый, когда новый будет толкать его по емкости.

Код работает правильно.

Некоторое объяснение философии дизайна позади этого можно найти в Why are there no containers sorted by insertion order in Python's standard libraries?, который предполагает, что отсутствие сортированных структур смущает «один очевидный способ сделать это», когда дело доходит до выбора того, какой контейнер вы хотите (сравните с любым другим типы классов, реализующие Map, Set и List в Java - вы используете LinkedHashMap? или ConcurrentSkipListMap? или TreeMap? или WeakHashMap?).

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

  • Нет связанных вопросов^_^