6

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

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

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

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

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

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

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

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

4

3 回答 3

14

除了对您的代码进行小幅修复(@Zero Piraeus 提出的问题)之外,您的问题可能已在此处得到解答。遍历 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)。查看这个很好的答案以完全理解它们

于 2013-06-09T21:31:21.123 回答
1

您显示的代码没有多大意义。这是它的作用:

  • 遍历序列'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.
于 2013-06-09T21:26:08.580 回答
0

在尝试另一个答案时,该函数无法递归,因此我将其修改为不递归。它的运行速度仍然很快,并且可以处理大型嵌套列表(至少就我的测试而言)。它是仅 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
于 2015-08-28T22:08:53.357 回答