2016-04-09 3 views
0

нормально плохо попытаться упростить это:достигающие значения в словаре внутри словаре питона 2,7

первый вопрос: является словарем словарей считается более подходящим, чем список словарей?

2-й вопрос: Я изо всех сил стараюсь достичь второго уровня моих словарей, чтобы распечатать их в правильном порядке.

Я знаю, что dicts не заказываются, но мне удалось получить лямбда, чтобы заказать первый словарь, чтобы распечатать заметки 1-10.

Теперь мне нужно получить второй уровень для печати в том порядке, в котором они написаны (ID & ИМЯ перед СОДЕРЖАНИЕМ).

Любая помощь, чтобы получить контроль над этим была бы оценена;)

annotations = {} 
index = 1 
for i in range(10): 
annotations['Annotation #: '+str(i+1)+" --->>"] = { 
    'ID' : index, 
    'NAME:' : 'Tag Name', 
    'CONTENT:' : 'Note Content: This space will have a lot of text', 
    'URL:' : 'ref address', 
    'URL Info:' : 'url info', 
} 
index += 1 

for key, values in sorted(annotations.items(), key=lambda x: x[1]): 
    print "\n"+key 
    for k, v in sorted(values.items(), key = lambda item: item[1]): 
     print k, v 

выходы:

Annotation #: 1 --->> 
ID 1 
CONTENT: Note Content: This space will have a lot of text 
NAME: Tag Name 
URL: ref address 
URL Info: url info 

#....... etc.. to: 

Annotation #: 10 --->> 
ID 10 
CONTENT: Note Content: This space will have a lot of text 
NAME: Tag Name 
URL: ref address 
URL Info: url info 
+0

Я не уверен, что вы пытаетесь выполнить. Просьба уточнить – Bharel

+0

@Bharel извинения Я попытался немного убрать вопрос (ы). Было уже поздно, и я некоторое время бил головой об этом. В основном я хочу, чтобы иметь возможность печатать k, v в правильном порядке .. или отдельно пару по паре.Имеет ли это смысл? спасибо – dflamholc

+0

Что такое «правильный» заказ здесь? В настоящее время вы используете значения каждого словаря, которые дают довольно произвольный порядок (который случайно выглядит с вашими данными только случайно). Я подозреваю, что список объектов 'namedtuple' был бы намного более естественным для того, что вы делаете. – Blckknght

ответ

1

Если вы хотите, чтобы жестко контролировать порядок вещей в контейнере, я думаю, использование словарей - плохая идея. Как вы заметили, элементы в dict упорядочены произвольно. В настоящее время ваш код сортирует их по значению, но это не очень важно.

Я думаю, было бы гораздо естественнее использовать список для контейнера верхнего уровня, поскольку вы создаете объекты по порядку и хотите сохранить этот порядок. Ключи вашего словаря верхнего уровня были совершенно бессмысленными и могут быть заменены индексами (например, вывод enumerate).

Для внутренних объектов контейнера есть больше вариантов. Вы можете использовать OrderedDict (от модуля collections в стандартной библиотеке) вместо обычного dict. Это позволит вам перебирать словарь items в том же порядке, в котором вы их добавили. Вам нужно будет избегать использования словарного литерала для определения объекта, хотя, или порядок будет потерян до того, как элементы были в OrderedDict.

Другим хорошим вариантом может быть создание собственного типа с типоразмера namedtuple (также от collections). Тип, который вы получили бы, будет своего рода tuple, который позволяет доступ к атрибутам для своих членов, в дополнение к индексированию.

Вы также можете написать свой собственный класс, который обрабатывает его атрибуты, но вы хотите. Вы можете написать метод __str__, который может превращать данные в строку в любом формате.

Как вы просили в комментариях, вот быстрый и грязный реализация используя list из OrderedDict S:

from collections import OrderedDict 

annotations = [OrderedDict([('ID', i + 1),  # need to initialize with a list of tuples 
          ('NAME', 'Tag Name'), # to preserve the order of the items 
          ('CONTENT', 'Note Content: This space will have a lot of text'), 
          ('URL', 'ref address'), 
          ('URL Info', 'url info')]) 
       for i in range(10)] 

for i, dct in enumerate(annotations): 
    print("Annotation #{}".format(i+1)) 
    for key, value in dct.items(): 
     print("{}: {}".format(key, value)) 
    print() 

Я создал все аннотации в списке понимание здесь. Когда вы создаете свои реальные данные с помощью не-фиктивных данных, вы не сможете сделать это так же легко, но он должен работать так же хорошо, если вы выписываете обычный цикл for и appendOrderedDict s.

+0

еще раз спасибо @Blckknght за информацию и объяснение. Излишне говорить, что я новичок; любой шанс для небольшого примера того, как я мог бы настроить, используя список OrderedDicts? Я читал все материалы, которые вы написали, но я немного перекрестно посмотрел на этот момент – dflamholc

+0

и снова спасибо! @Blckknght для этого! извините за то, что он был настолько тупым, что попросил это прямо, но для меня это больше имеет смысл, чем я даже надеялся. Я постараюсь сначала пройти через это на своем компьютере утром;) – dflamholc

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