为了账号安全,请及时绑定邮箱和手机立即绑定

Python:如何遍历List [Dict {List [Dict {}]}]

Python:如何遍历List [Dict {List [Dict {}]}]

拉莫斯之舞 2021-03-10 13:08:09
我只是想知道是否有一种简单的方法来做到这一点。我有一个从文件解析的特殊结构,输出是字典列表的字典列表。目前,我只有一些看起来像这样的代码:for i in xrange(len(data)):    for j, k in data[i].iteritems():        for l in xrange(len(data[i]['data'])):            for m, n in data[i]['data'][l].iteritems():                dostuff()我只是想知道是否有一个遍历结构的函数,并在内部确定每个条目是列表还是字典,如果是字典,则遍历该字典,依此类推。我只使用Python大约一个月左右,所以我绝不是该语言的专家,甚至不是中级用户。预先感谢您的回答。
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

您永远不需要遍历xrange(len(data))。您可以通过data(对于列表)或data.items()(或values())(对于字典)进行迭代。


您的代码应如下所示:


for elem in data:

    for val in elem.itervalues():

        for item in val['data']:

这要短得多。


查看完整回答
反对 回复 2021-03-30
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

可以,如果您希望降低数组/哈希事物的任意结构,则可以创建一个函数来基于该type()函数执行此操作。


def traverse_it(it):

    if (isinstance(it, list)):

        for item in it:

            traverse_it(item)

    elif (isinstance(it, dict)):

        for key in it.keys():

            traverse_it(it[key])

    else:

        do_something_with_real_value(it)

请注意,一般面向对象的专家会告诉您不要这样做,而是创建一个类树,其中一个基于数组,另一个基于dict,然后只有一个函数来处理具有相同函数名的每个函数(即,一个虚拟函数)并在每个类函数中调用它。IE,如果/基于类型的其他树是“坏的”。可以在对象上调用的函数以其自身的“良好”方式处理其内容。


查看完整回答
反对 回复 2021-03-30
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

我认为这就是您要尝试做的。xrange()由于for迭代列表的每个值,因此无需使用从列表中拉出索引的方法。d1因此,在下面的示例中,是对current的引用data[i]。


for d1 in data: # iterate over outer list, d1 is a dictionary

    for x in d1: # iterate over keys in d1 (the x var is unused)

        for d2 in d1['data']: # iterate over the list


            # iterate over (key,value) pairs in inner most dict

            for k,v in d2.iteritems():

                dostuff()

您还会使用该名称l两次(有意或无意),但要注意作用域的工作原理。


查看完整回答
反对 回复 2021-03-30
  • 3 回答
  • 0 关注
  • 341 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号