【问题标题】:iterate python nested lists efficiently有效地迭代python嵌套列表
【发布时间】:2013-06-09 21:10:02
【问题描述】:

我正在使用 Python 进行网络流量监控项目。对Python不太熟悉,所以我在这里寻求帮助。

简而言之,我正在检查进出流量,我是这样写的:

for iter in ('in','out'):
        netdata = myhttp()
        print data

netdata 是一个由嵌套列表组成的列表,它的格式是这样的:

[ [t1,f1], [t2,f2], ...]

这里t 代表时刻,f 是流动。但是我现在只想保留这些 f 进出,我想知道有什么方法可以获得有效的代码。

经过一番搜索,我想我需要使用创建一个流量列表(2 个元素),然后使用 zip 函数同时迭代两个列表,但我很难写出正确的列表。由于我的netdata是一个很长的列表,所以效率也很重要。

如果有任何令人困惑的地方,请告诉我,我会尽力澄清。 感谢您的帮助

【问题讨论】:

    标签: python nested-lists


    【解决方案1】:

    除了对您的代码进行小幅修复(@Zero Piraeus 提出的问题)之外,您的问题可能已得到回答 here。遍历 N 度(树)列表的可能代码如下:

    def traverse(item):
        try:
            for i in iter(item):
                for j in traverse(i):
                    yield j
        except TypeError:
            yield item
    

    例子:

    l = [1, [2, 3], [4, 5, [[6, 7], 8], 9], 10]
    print [i for i in traverse(l)]
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

    使其工作的关键是递归,而使其有效工作的关键是使用生成器(关键字yield 给出了提示)。生成器将遍历您的列表列表并逐项返回给您,而无需复制数据或创建一个全新的列表(除非您使用整个生成器将结果分配给列表,就像在我的示例中一样)

    使用迭代器和生成器可能是难以理解的奇怪概念(主要是关键字yield)。查看此great answer 以充分了解它们

    【讨论】:

      【解决方案2】:

      您展示的代码没有多大意义。它的作用如下:

      • 遍历序列'in', 'out',在其两次通过循环时将这两个字符串中的每一个依次分配给变量iter(在过程中屏蔽内置函数iter())。

      • 完全忽略循环内iter的值。

      • myhttp() 的结果分配给变量netdata,在每次通过循环时。

      • 完全忽略netdata 的值,而是尝试在每次循环时打印未定义的变量data

      鉴于您描述的嵌套列表,您可能想要这样的东西:

      for t, f in myhttp():
          print t
          print f
          # ... or whatever you want to do with those values.
      

      【讨论】:

        【解决方案3】:

        当尝试另一个答案时,该函数无法递归,因此我将其修改为不递归。它的运行速度仍然很快,并且可以处理大型嵌套列表(至少就我的测试而言)。它是 Python 3 独有的函数。

        # Originally by Bruno Polaco
        def traverse(item, reverse=False):
            its = [item] #stack of items to-be-processed
            out = [] # Output (no longer generator)
            ite = False
            while len(its) > 0:
                it = its.pop()
                try: # Check if item is iterable
                    iter(it)
                    ite = not isinstance(it, str)
                except TypeError:
                    ite = False
                if ite: # Do something with it
                    for i in it:
                        its.append(i)
                else:
                    out.append(it)
            if not reverse:
                out.reverse()
            return out
        

        【讨论】:

          猜你喜欢
          • 2011-10-14
          • 1970-01-01
          • 1970-01-01
          • 2018-11-17
          • 2012-01-05
          • 1970-01-01
          • 1970-01-01
          • 2015-07-07
          • 2013-05-11
          相关资源
          最近更新 更多