【问题标题】:how to enumerate OrderedDict in python如何在python中枚举OrderedDict
【发布时间】:2013-10-01 08:28:11
【问题描述】:

所以,我是一名正在尝试学习 python 的 php 程序员。我有一个我想要排序的字典。我把它们变成了 OrderedDict。他们完美地排序, 原始字典看起来像这样。这只是一个 3 维数组吧?

a["01/01/2001"]["un"]=1
a["01/01/2001"]["nn"]=1
a["01/02/2001"]["aa"]=2
a["01/02/2001"]["bb"]=2
a["01/03/2001"]["zz"]=3
a["01/03/2001"]["rr"]=3

我可以将它们转换为 OrderedDict,并希望以以下格式呈现它们

"01/01/2001" un=1 nn=1
"01/02/2001" aa=2 bb=2
"01/03/2001" zz=3 rr=3

我可以在 php 中编写一个简单的循环来遍历这个关联数组,但我不知道如何在 python 中执行它。有人可以帮忙吗?

【问题讨论】:

  • OrderedDict 并不意味着“排序的字典”。这意味着“保留将项目插入到字典中的顺序”,因此只有在您按排序顺序插入它们时才会对它们进行排序。要始终按排序键顺序获取 dict,请使用 for key,value in sorted(dictvar.iteritems()):,并且不需要 OrderedDict 的开销即可执行此操作。
  • 感谢您的建议。那么,我该如何根据日期对上述字典 a 的字典进行排序,并以上述格式显示它们?我对python很陌生,很困惑

标签: python python-2.7 ordereddictionary


【解决方案1】:

使用dict.items() 或dict.iteritems() 方法遍历键和值;后者让您无需构建中间键值对列表即可进行迭代:

for date, data in a.iteritems():
    print date,
    for key, value in data.iteritems():
        print '{}={}'.format(key, value),
    print

直接在字典上循环会为您提供键;您仍然可以使用订阅访问这些值:

for date in a:
    print date,
    for key in a[date]:
        print '{}={}'.format(key, a[date][key]),
    print

【讨论】:

  • 我收到一条错误消息:for key, value in data.iteritems(): AttributeError: 'function' object has no attribute 'iteritems'
  • @user2773013 看起来tld 是一个函数。在您最初的问题中,变量 a 似乎是您要迭代的字典。请改用a.iteritems()。
  • @user2773013:a 中还存储了什么? a 中的至少 一个 值似乎是一个函数。
  • @user2773013:我的代码确实假定a中的所有值都是字典。您的样本集似乎不是这种情况。
  • a 是 OrderedDictionary 转换使用 a=OrderedDict(something.items(),key = lambda x,y:(time.strptime(string.lower(x[0])),"%d/% b/%Y"),x[1])) something 是字典的字典,看起来与我上面提到的变量 a 完全一样。
【解决方案2】:

我认为使用默认字典而不是 OrderedDict 会更好:

from collections import defaultdict

a = defaultdict(dict)
a["01/03/2001"]["zz"]=3
a["01/01/2001"]["un"]=1
a["01/02/2001"]["aa"]=2
a["01/01/2001"]["nn"]=1
a["01/02/2001"]["bb"]=2
a["01/03/2001"]["rr"]=3

# a is now a dict of dicts, each key is a date and each value is a dict of all 
# subkey-values

# print out in date order
for k,v in sorted(a.items()):
    # for each subdict, print key=value in sorted key order
    print k, ' '.join("%s=%s" % (kk,vv) for kk,vv in sorted(v.items()))

打印:

01/01/2001 nn=1 un=1
01/02/2001 aa=2 bb=2
01/03/2001 rr=3 zz=3

编辑:

啊!我的错,您希望 k=v 值按插入顺序显示,因此您需要 OrderedDict 的 defaultdict:

from collections import defaultdict, OrderedDict

a = defaultdict(OrderedDict)
a["01/01/2001"]["un"]=1
a["01/01/2001"]["nn"]=1
a["01/02/2001"]["aa"]=2
a["01/02/2001"]["bb"]=2
a["01/03/2001"]["zz"]=3
a["01/03/2001"]["rr"]=3

# print out in date order
for k,v in sorted(a.items()):
    # for each subdict, print key=value in as-inserted key order, so no sort requred
    print k, ' '.join("%s=%s" % (kk,vv) for kk,vv in v.items())

打印:

01/01/2001 un=1 nn=1
01/02/2001 aa=2 bb=2
01/03/2001 zz=3 rr=3

【讨论】:

    【解决方案3】:

    试试这个代码。

    a = {
            "01/01/2001": {"un": 1, "nn": 1}, \
            "01/02/2001": {"aa": 2, "bb": 2}, \
            "01/03/2001": {"zz": 3, "rr": 3}
        }
    
    class decor(object):
        def __init__(self, a):
            self.a = a
    
        def __call__(self, fun):
            def wrapper(key, _list):
                print key, ' '.join(["{}={}".format(ele, self.a[key][ele]) \
                            for ele in _list
                        ])
                fun(key)
            return wrapper
    
    @decor(a)
    def main_fun(key):
        pass
    
    for key in sorted(a.keys()):
        main_fun(key, [inner_key for inner_key in sorted(a[key].keys())])
    

    【讨论】:

      猜你喜欢
      • 2015-08-08
      • 2011-05-03
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 2021-05-25
      • 2023-04-10
      • 1970-01-01
      • 2016-02-14
      相关资源
      最近更新 更多