在字典中达到字典中的值 python 2.7

reaching values in dictionary inside dictionary python 2.7

好的,我试着简化一下:

第一个问题:字典的字典被认为比字典列表更合适吗?

第二个问题:我正在努力达到我的词典的第二级以正确的顺序打印出来。

我知道字典没有排序,但我设法让 lambda 排序第一本字典以打印出 1-10 的注释。

现在我需要让第二层按照写入的顺序打印出来(ID 和 NAME 在 CONTENT 之前)。

如能提供任何帮助以控制此问题,我们将不胜感激;)

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

如果你想严格控制容器中事物的顺序,我认为使用字典不是一个好主意。正如您所注意到的,dict 中的项目是任意排序的。目前您的代码按值对它们进行排序,但这意义不大。

我认为为顶级容器使用列表会更自然,因为您正在按顺序创建对象并希望保持该顺序。顶级字典的键非常无意义,可以用索引替换(例如 enumerate 的输出)。

对于内部容器对象,有更多的选择。您可以使用 OrderedDict(来自标准库中的 collections 模块)而不是常规的 dict。这将使您可以按照添加它们的相同顺序遍历字典的 items 。不过,您需要避免使用字典文字来定义对象,否则在项目进入 OrderedDict.

之前顺序会丢失

另一个不错的选择可能是使用 namedtuple 类型工厂(也来自 collections)创建您自己的类型。您将获得的类型是一种 tuple,除了索引之外,它还允许其成员访问属性。

您也可以编写自己的 class,它可以根据需要处理其属性。您可以编写一个 __str__ 方法,将数据转换为您想要的任何格式的字符串。

正如您在评论中所要求的,这是一个使用 OrderedDictlist 的快速而肮脏的实现:

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 循环和 append 它应该也能正常工作OrderedDict 到它。