DefaultDict, для элементов добавления, поддерживать ключи, отсортированные в порядке добавления [дубликаты]

Я создал пустой defaultdict(list) и добавляю в него. Я хочу, чтобы ключи были отсортированы в порядке добавления. Мой код принимает ввод.

Ввод:

4
bcdef
abcdefg
bcde
bcdef

Мой код:

from collections import defaultdict
d = defaultdict(list)
a = int(input())
for i in range(a):
    temp = raw_input()
    d[temp].append(i)
for k in d:
    print k

Вывод:

bcde             
bcdef
abcdefg

Желаемый результат

bcdef
abcdefg
bcde

person Charan    schedule 02.08.2015    source источник


Ответы (1)


Вы можете использовать collections.OrderedDict для сохранения порядка вставки ключей. .

>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> for i in range(4):
...     d.setdefault(input(), []).append(i)
... 
bcdef
abcdefg
bcde
bcdef
>>> print("\n".join(d))
bcdef
abcdefg
bcde

Здесь мы используем метод setdefault, который установит значение по умолчанию (второй аргумент) для ключа, если он еще не найден в словаре. И setdefault возвращает значение, соответствующее ключу, поэтому в этом случае, если ключа там нет, то новый список назначается против ключа, и он будет возвращен. Если ключ уже существует, то будет возвращен существующий список, соответствующий этому. И мы просто вызываем append в возвращаемом списке.

person thefourtheye    schedule 02.08.2015
comment
Спасибо, решил мою проблему, но у меня есть сомнения. Я читал, что defaultdict(list) быстрее, чем dict.setdefault. Я попробовал OrderedDict(list), но выдало ошибку. Таким образом, с OrderedDict() единственным способом является dict.setdefault. правильно? - person Charan; 02.08.2015
comment
@Charan Правильно, с OrderedDict вы можете использовать только setdefault. - person thefourtheye; 02.08.2015