2014-02-12 93 views
0

我知道以下2种方法:如何在python 2.7中访问嵌套列表(或数组)的元素?

代码:

mylist = [{'outer':[{'inner':[1,2,3]}, {'inner':[4,5,6,7]}]} , 
     {'outer':[{'inner':[11,22,33]}, {'inner':[44,55,66,77]}]} 
    ] 

上述名单是例如我的我在哪里倾销JSON格式的信息,也可以加载它的原代码。所以“mylist”是加载的json文件。

第一方法

for c in mylist: 
    for d in c['outer']: 
     for e in d['inner']: 
      print e 

第二方法

for i in range(len(mylist)): 
    for j in range(len(mylist[i]['outer'])): 
     for k in range(len(mylist[i]['outer'][j]['inner'])): 
      print mylist[i]['outer'][j]['inner'][k] 

哪些访问嵌套列表(或阵列)的元件上方2种方法之间的差异?

他们之间有什么技术差异?

除上述方法外,还有其他更好的方法吗?

+1

易于?这不是第一种明确的赢家吗?看看你在第二种方法中输入的单词数量。对于定时使用'timeit'模块,反正按索引访问项目不是Pythonic的方式。 –

+0

第二种方法根本不是Pythonic,认为这是一种替代方法:'[i ['inner'] for z ['outer'] for z in mylist]' –

+0

@AshwiniChaudhary FYI我使用timeit检查了执行时间模块和第一种方法比第二种方法需要更多的时间。 – Patrick

回答

0

使用nest list comprehensions

In [48]: print [e for c in mylist for d in c['outer'] for e in d['inner']] 
[1, 2, 3, 4, 5, 6, 7, 11, 22, 33, 44, 55, 66, 77] 

它应该是更短,更快一点(通过打印整个东西一次)。

0

您可以创建功能扁平化这样您的输入列表:

from collections import Iterable 

def flatten(l): 
    for element in l: 
     if isinstance(element, Iterable) and not isinstance(element, basestring): 
      if isinstance(element, dict): 
       element = element.values() 
      for i in flatten(element): 
       yield i 
     else: 
      yield element 

使用您的输入:

In [3]: [ item for item in flatten(mylist) ] 
Out[3]: [1, 2, 3, 4, 5, 6, 7, 11, 22, 33, 44, 55, 66, 77] 

它的工作原理,甚至像多个嵌套表:

mylist = [ {'outer': 
       { 'inner': 
        { 'inner-1': 1, 'inner-1-1': 11}, 
        'inner2': 
        [ set((1,2,3,4)), tuple((5,6,7,8)), [9,10,11] ], 
      }}] 

In [3]: [ item for item in flatten(mylist) ] 
Out[3]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 11] 
相关问题