在字典中达到字典中的值 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__
方法,将数据转换为您想要的任何格式的字符串。
正如您在评论中所要求的,这是一个使用 OrderedDict
的 list
的快速而肮脏的实现:
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
到它。
好的,我试着简化一下:
第一个问题:字典的字典被认为比字典列表更合适吗?
第二个问题:我正在努力达到我的词典的第二级以正确的顺序打印出来。
我知道字典没有排序,但我设法让 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__
方法,将数据转换为您想要的任何格式的字符串。
正如您在评论中所要求的,这是一个使用 OrderedDict
的 list
的快速而肮脏的实现:
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
到它。