【问题标题】:reaching values in dictionary inside dictionary python 2.7在字典python 2.7中达到字典中的值
【发布时间】:2016-07-30 20:46:33
【问题描述】:

好吧,我试着简化一下:

第一个问题:是否认为字典比字典列表更合适?

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

我知道 dicts 没有排序,但我设法让 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

【问题讨论】:

  • 我不确定您要完成什么。请澄清
  • @Bharel 道歉我已经尝试清理一下问题。已经很晚了,我已经为此苦苦挣扎了一段时间。基本上我希望能够以正确的顺序打印 k、v.. 或单独成对地打印。那有意义吗?谢谢
  • 这里的“正确”顺序是什么?目前,您正在使用每个字典的值,它给出了一个非常任意的顺序(碰巧与您的测试数据看起来不错只是偶然)。我怀疑namedtuple 对象列表对于您正在做的事情会更自然。
  • @Blckknght 哦,我确信sorted(annotations.items(), key=lambda x: x[1]): 帮助我获得了 1-10 的第一级字典。不是这样吗?
  • @DavidFlamholc:这只是偶然。您的内部字典仅相差ID 值,所以这就是最终比较的结果。我认为,如果您对其他键有不同的值,那么您会得到相当随机的顺序。它也不适用于 Python 3,其中 dict 对象根本无法比较!

标签: python-2.7 dictionary lambda nested ordereddictionary


【解决方案1】:

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

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

对于内部容器对象,有更多选择。您可以使用OrderedDict(来自标准库中的collections 模块)而不是常规的dict。这将让您以添加它们的相同顺序迭代字典的items。不过,您需要避免使用字典文字来定义对象,否则在项目位于 OrderedDict 中之前,订单将丢失。

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

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

按照您在 cmets 中的要求,这是一个使用 listOrderedDicts 的快速而肮脏的实现:

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,它应该同样有效给它。

【讨论】:

  • 再次感谢@Blckknght 的信息和解释。不用说我是初学者;有没有机会提供一个小例子来说明如何使用 OrderedDicts 列表进行设置?我一直在阅读你写的所有东西,但此时我有点眼花缭乱
  • 再次感谢! @Blckknght 为此!很抱歉这么直率地要求这个,但这对我来说真的比我希望的更有意义。早上第一件事我会尝试在我的电脑上浏览它;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
相关资源
最近更新 更多