簡體   English   中英

有效地迭代python嵌套列表

[英]iterate python nested lists efficiently

我正在使用Python進行網絡流量監控項目。 不熟悉Python,所以我在這里尋求幫助。

簡而言之,我正在檢查流量和流量,我這樣寫:

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

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

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

這里t表示時刻, f表示流量。 但是我只想在這個時刻保留這些f進行內外,我想知道如何獲得有效的代碼。

經過一些搜索,我認為我需要使用創建流量列表(2個元素),然后使用zip函數同時迭代這兩個列表,但是我很難寫出正確的列表。 由於我的netdata是一個很長的列表,效率也非常重要。

如果有任何令人困惑的事情,請告訴我,我會盡力澄清。 感謝幫助

除了代碼的小修復(@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 )。 查看這個很好的答案,以完全理解它們

你展示的代碼沒有多大意義。 這是它的作用:

  • 迭代序列'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.

當嘗試其中一個答案時,該函數無法遞歸,因此我將其修改為不遞歸。 它仍然可以很快地運行,並且可以處理大型嵌套列表(至少就我的測試而言)。 它只是一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM