6

Python でネットワーク トラフィック モニター プロジェクトに取り組んでいます。Python にはあまり詳しくないので、ここで助けを求めています。

要するに、トラフィックのインとアウトの両方をチェックしています。次のように書きました。

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

netdata は、ネストされたリストで構成されるリストであり、その形式は次のようになります。

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

ここtは瞬間を表し、f流れです。ただし、現時点では、in と out の両方でこれらの f を保持したいだけです。効率的なコードを取得する方法はあるのでしょうか。

いくつかの検索の後、トラフィック (2 つの要素) のリストを作成し、zip 関数を使用して両方のリストを同時に反復する必要があると思いますが、正しいものを書くのは困難です。私のネットデータは非常に長いリストなので、効率も非常に重要です。

紛らわしいことがあればお知らせください。明確にしようと思います。手伝ってくれてありがとう

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 に答える
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 に答える