有效地迭代python嵌套列表

2024-06-11 06:31:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python开发一个网络流量监视器项目。对Python不太熟悉,所以我在这里寻求帮助。

简言之,我正在检查进出交通,我是这样写的:

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

netdata是一个由嵌套列表组成的列表,其格式如下:

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

这里t表示时刻,f表示流。不过,我只想在这一刻保持这些f的输入和输出,我想知道有什么方法可以得到一个有效的代码。

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

如果有什么困惑,让我知道,我会尽量澄清。 谢谢你的帮助


Tags: 项目in列表fordata格式out监视器
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

除了对代码进行一些小的修改(由@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以完全理解它们

你所显示的代码没有多大意义。它的作用如下:

  • 循环遍历序列'in', 'out',依次将这两个字符串中的每一个赋给变量iter(在进程中屏蔽内置函数^{}),该变量在其两个传递的循环上。

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

  • myhttp()的结果赋给变量netdataon每次通过循环。

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

根据您描述的嵌套列表,您可能需要这样的内容:

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

相关问题 更多 >